重新绘制JButton的集合

时间:2011-01-24 19:25:14

标签: java swing

我正在绘制一组JButton。 调用setBackground会立即重新绘制该按钮。

问题是,重复调用redraw时,按钮不会同步更新。

即。在redraw()的同一个传递中,重绘一个按钮和另一个按钮之间有一点延迟。

有没有办法让所有按钮重绘在一起?

我很感激任何指示或建议。感谢。

注意:

  • CellButton扩展了javax.swing.JButton。
  • 所有按钮都包含在JPanel grid

final JPanel grid = new JPanel();

Collection<CellButton> cells = new ArrayList<CellButton>();

for(int j=0;j<gridSize;j++){
    for(int i=0;i<gridSize;i++){
        CellButton cellButton = new CellButton(i,j);
        cellButton.setBackground(Color.gray);
        cellButton.addMouseListener(gridListener);
        cells.add(cellButton);
        grid.add(cellButton);
    }
}

...

void redraw(){
    Iterator<CellButton> iter = cells.iterator();
    int x,y;
    while(iter.hasNext()){
        CellButton cellBtn=iter.next();
        x=cellBtn.x();
        y=cellBtn.y();
        cellBtn.setBackground(model.getColor(x,y));
    }
}`

2 个答案:

答案 0 :(得分:1)

您是否在Event Dispatch Thread上执行代码。设置背景只会安排一个组件进行重新绘制。 RepaintManagers收集所有重新绘制的请求,并一次完成它们以提高效率。重新粉刷只在美国东部时间进行。因此,您更改了EDT上的所有属性,按钮应该同时重新绘制。

答案 1 :(得分:0)

查看以下内容是否适用。

public class ButtonsRedraw {

public static void main(final String[] args) {
final List<JButton> buttons = new ArrayList<JButton>();

SwingUtilities.invokeLater(new Runnable() {

    @Override
    public void run() {
    final JButton green = new JButton(new AbstractAction("Green") {
        @Override
        public void actionPerformed(final ActionEvent e) {
        // runs on EDT
        for (final JButton button : buttons) {
            button.setBackground(Color.green);
        }
        }
    });

    final JButton yellow = new JButton(new AbstractAction("Yellow") {
        @Override
        public void actionPerformed(final ActionEvent e) {
        // runs on EDT
        for (final JButton button : buttons) {
            button.setBackground(Color.yellow);
        }
        }
    });

    for (int index = 1; index <= 10; index++) {
        buttons.add(new JButton("Button " + index));
    }

    final JPanel buttonPanel = new JPanel();
    buttonPanel.add(green);
    buttonPanel.add(yellow);
    for (final JButton button : buttons) {
        buttonPanel.add(button);
    }

    final JFrame frame = new JFrame("Colored buttons");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.add(buttonPanel);

    frame.pack();
    frame.setVisible(true);
    }
});
}
}

基本上,第一个按钮将背景颜色更改为绿色,列表中的十个按钮,第二个按钮将颜色更改为黄色。请注意,在EDT上调用actionPerformed,这可确保将任何组件模型或组件属性更改传播到偶数队列以进行重新绘制。因此,无需重新调用。