访问其他类的swing组件

时间:2013-01-19 06:19:43

标签: java swing components jlabel jcheckbox

我有两个类mainpanel.java和subpanel.java。 subpanel.class包含一个复选框和一些标签。当我点击mainpanel.java中的一些按钮时,我想更改这些组件的setSelected()和setText()。

我在subpanel.java中创建了一个方法,我从mainpanel.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静态。但是从我学到的东西,我们不应该使用静态组件,除非非常必要。 有没有其他方法来改变组件?

2 个答案:

答案 0 :(得分:3)

这不适合updateUI(),“将UI属性重置为当前外观的值。”如评论中所述,使用revalidate()仅在将组件添加到封闭Container或从封闭repaint()中删除时才有用。而是直接在子面板实例上调用repaint()。为了获得更大的灵活性,请使用建议here的观察者模型。

附录:此示例使用Action来封装按钮的行为。由于复选框的选定状态是绑定属性,因此组件会自动重新绘制,但您可以根据需要显式调用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(); } }); } } 的引用。

{{1}}

答案 1 :(得分:3)

如果我理解了你的问题,那么我认为你想编写一个单独的ActionListener类并在那里执行操作,这将启用或禁用UI类中的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;
}
}