updateUI()
これは、「UI プロパティを現在のルック アンド フィールの値にリセットする」の適切な使用方法ではありません。コメントで提案されているように、を使用revalidate()
すると、コンポーネントが外側の に追加または削除された場合にのみ役立ちますContainer
。代わりにrepaint()
、サブパネル インスタンスで直接呼び出します。柔軟性を高めるには、ここで提案されているオブザーバー パターンを使用します。
補遺: この例はAction
、ボタンの動作をカプセル化するために使用します。チェックボックスの選択状態はバインドされたプロパティであるため、コンポーネントは自動的に再描画されますが、repaint()
必要に応じて明示的に呼び出すことができます。
補遺: 参照をパラメーターとして渡すように更新します。
補遺: このバリエーションでは、パラメーターはエクスポートされた への参照Action
です。
import java.awt.EventQueue;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
/** @see https://stackoverflow.com/a/14412516/230513 */
public class Example {
private void display() {
JFrame f = new JFrame("Example");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setLayout(new GridLayout(0, 1));
JPanel panel = new JPanel();
final JCheckBox check = new JCheckBox("Check");
Action checkAction = new AbstractAction("Update") {
@Override
public void actionPerformed(ActionEvent e) {
check.setSelected(!check.isSelected());
}
};
panel.add(check);
f.add(panel);
f.add(new SubPanel(checkAction));
f.pack();
f.setLocationRelativeTo(null);
f.setVisible(true);
}
private static class SubPanel extends JPanel {
public SubPanel(final Action action) {
this.add(new JButton(action));
}
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
new Example().display();
}
});
}
}