【问题标题】:Coloring a JButton in Java在 Java 中为 JButton 着色
【发布时间】:2011-10-05 17:02:53
【问题描述】:

我在为一组 JButton 着色时遇到问题。

我制作了两个 JButton 数组:

public JButton Speler1[] = new JButton[140]; //Player1
public JButton Speler2[] = new JButton[140]; //Player2

这两个按钮阵列构成了赛车游戏的通道 1 和通道 2。我希望玩家 1 和 2 的位置在两个屏幕上都有颜色。所以玩家 1 可以看到玩家 2 在哪里,反之亦然。

我已经制作了一个方法,可以将两个玩家的位置发送给彼此。

if (message.contains("Positie")) {
   String posit = message.replaceFirst("Positie", "");
   int positi = Integer.valueOf(posit);
   positie2 = positi;
   kleurHokje kleur = new kleurHokje();
   kleur.hokVerkleur(positi); // positi is the position of each player
}

所以当我调用方法 hokVerkleur(positi) 时,我想更改通道 2 上的按钮。

class kleurHokje{
    public void hokVerkleur(int loc){
        Speler2[loc].setBackground(Color.yellow);
        Speler2[positie2].setBackground(Color.gray);                
    }
}

它只是行不通。虽然我对 Speler1[positie] 所做的几乎相同,但 Speler1 不使用网络,它可以按我的意愿工作。

感谢任何帮助,

谢谢杰夫

编辑: 如果我将代码放在其中一个 MouseListener 中,它可以正常工作,但它会自动着色,而不必每次都单击。

 class Klaar extends MouseAdapter {

    public void mouseClicked(MouseEvent e) {            
        Speler2[positie2].setBackground(Color.gray);
    }
}

附言。我的母语不是英语,希望你能理解我的问题。

【问题讨论】:

  • 您确认hokVerkleur 确实被调用了吗?如果它没有被调用,那么代码试图做什么并不重要。使用调试器或System.out.println("debug") 语句调试您的程序,并找出正在工作的内容。在您向我们提供这些信息之前,您还没有付出足够的努力来帮助我们帮助您(请参阅:SSCCE)。
  • 当我在 hokVerkleur 中使用 System.out.println("Position "+loc); 时,它会打印出应该更改的位置。
  • 您应该在更改颜色后立即在按钮上尝试 .repaint()。 Swing 的不一致之处在于更改 一些 组件属性会自动重绘组件,但更改其他属性不会。
  • 另外看看setBackground的文档:上面说不保证画背景。这取决于 JComponent 的子类是否决定这样做。我不知道 JButton 是否忽略 setBackground(不在 API 中)。
  • 使用.repaint() 不起作用。现在吃晚饭,之后我会看一下文档。感谢您的回答!

标签: java swing jbutton colorize


【解决方案1】:
If I place my code in one of the MouseListeners it works fine:

同意,如果您从 BackGroung Task 更改 JButton 的颜色,那么有任何更改,Concurency in Swing 有一些问题,您更新到 GUI 的 EDT 已超出,

1) 那么你必须将着色 JButtons 包装到 invokeLater();

    java.awt.EventQueue.invokeLater(new Runnable() {

        @Override
        public void run() {
            Speler2[loc].setBackground(Color.yellow);
            Speler2[positie2].setBackground(Color.gray);
        }
    });

2) 但你必须使用常规的 Swing 方法来解决

2a) 将与 GUI 相关的代码包装到 javax.swing.Action

2b) 从

初始化您的 BackGroung 任务

【讨论】:

  • @stereofrog 没问题给你我的……1) 我投票认为这是题外话,2) 不是你的反对者,反对者是上帝,3)你的问题不仅仅是与本机操作系统相关的问题,4) 那里我看不到关于 PL 的真正问题 5) 问题与 programmers.stackexchange.comsuperuser.com 6) 相关,也许你的问题会被转移到另一个论坛(而不是关闭)
  • 创建了一个可运行的线程。 public void actionThread() { Thread t = new Thread() { public void run() { while (!stop) { tegenspelerPositie(); Score(); eigenOgen(); try { sleep(100); } catch (InterruptedException ex) { } } } }; t.start(); } 现在就像魅力一样。
  • 别睡了,我知道这行得通,但只适用于一个当前线程,如果有两个或更多线程,那么再次冻结,将其包装到 invokeLater() :-)
  • 再次抱歉,invokeLater 应该放在哪里?
  • 将与 GUI 相关的代码包装到 invokeLater() 中,用于通知 EDT 关于 GUI 的更改
【解决方案2】:

制作了一个可运行的线程,作为一个魅力。谢谢大家的帮助。

public void actionThread() {
    Thread t = new Thread() {

        public void run() {
            while (!stop) {
                tegenspelerPositie();
                Score();
                eigenOgen();
                try {
                    sleep(100);
                } catch (InterruptedException ex) {
                }
            }
        }
    };
    t.start();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-18
    • 1970-01-01
    • 2023-02-22
    • 1970-01-01
    • 2011-05-07
    • 1970-01-01
    相关资源
    最近更新 更多