1

mainpanel.java と subpanel.java の 2 つのクラスがあります。subpanel.class には、チェックボックスといくつかのラベルが含まれています。mainpanel.java のいくつかのボタンをクリックしたときに、これらのコンポーネントの setSelected() および setText() を変更したいと考えています。

mainpanel.java から呼び出してブール値を渡すメソッドを subpanel.java に作成しました。

public void schedulerchange(boolean check){
        System.out.println("checked"+check);
        scheduleenabler.setEnabled(check);
        scheduleenabler.setSelected(check);
        scheduleinfo.setText("Scheduler in On");
        //subpanel21.updateUI();
    }

mainpanel.java からこの関数を呼び出すと、関数は呼び出されますが、jcheckbox と jlabel を静的にしない限り、値は変更されません。しかし、私が学んだことから、非常に必要でない限り、静的コンポーネントを使用すべきではありません。コンポーネントを変更する他の方法はありますか?

4

2 に答える 2

3

あなたの質問を理解したら、別のクラスを作成し、UI クラスでActionListener有効または無効にするアクションを実行する必要があると思います。JCheckBox以下のコードはそれを示しています。チェックボックスの参照をそのPerformActionクラスに渡し、ボタンをクリックして有効または無効にします。

import java.awt.EventQueue;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class MainClass {

 MainClass() {
    JFrame jfrm = new JFrame("JTable Demo");
    jfrm.setLayout(new FlowLayout());
    jfrm.setSize(460, 180);
    jfrm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    JCheckBox check = null;
    // Get the Panel from the subclass;
    JPanel panel = new CheckBox().getCheckBoxPanel();

    // From the compoenents present in the panel get the CheckBox compoenent.
    for(int i = 0; i < panel.getComponentCount(); i++) {
       if(panel.getComponent(i) instanceof JCheckBox) {
        check = (JCheckBox) panel.getComponent(i);
        }
    }

    JButton button = new JButton("Click");

    // Pass the CheckBox Compoenent to the ActionListener.
button.addActionListener(new PerformAction(check));

    jfrm.add(button);
    jfrm.add(panel);
    jfrm.setVisible(true);
 }

  public static void main(String args[]) {
  EventQueue.invokeLater(new Runnable() {

      @Override
      public void run() {
          new MainClass();
      }
  });
 }
}

class PerformAction implements ActionListener {

JCheckBox check = null;
public PerformAction(JCheckBox checkBox) {
    check = checkBox;
}
@Override
public void actionPerformed(ActionEvent e) {
    boolean checkStatus = check.isSelected();
    if(checkStatus == true) {
        check.setEnabled(false);
        check.setSelected(false);
    } else {
        check.setEnabled(true);
        check.setSelected(true);
      }
}
}

 class CheckBox {
public JPanel getCheckBoxPanel() {
    JPanel checkPanel = new JPanel();
    JCheckBox check = new JCheckBox();
    checkPanel.add(new JLabel("CheckBox"));
    checkPanel.add(check);

    return checkPanel;
}
}
于 2013-01-19T10:04:59.413 に答える
3

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();
            }
        });
    }
}
于 2013-01-19T08:27:06.950 に答える