1

我有两个类 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 设为静态。但据我所知,除非非常必要,否则我们不应该使用静态组件。还有其他方法可以更改组件吗?

4

2 回答 2

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 回答
3

如果我理解了您的问题,那么我认为您想编写一个单独的ActionListener类并在那里执行将启用或禁用JCheckBoxUI 类中的操作。下面的代码显示了这一点。将您的复选框引用传递给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 回答