gpt4 book ai didi

java - 如何解决这个错误,如果我使用一个类会导致其他类接口(interface)也被感染

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:07:17 25 4
gpt4 key购买 nike

我的案例:

我有一个奇怪的BUG

enter image description here

我需要使用 1 个主类中的 2 个类,如下所示:

  • 驱动两个类的 1 个主类是 YumYumYum

  • 另外2个仅是用户界面的类如下:

    a) MyJSlider 主要BUG制造者

    b) Volume 第二个类,它只显示一个带有绿色进度条的黑色窗口

现在我已经在一个文件中准备了 SSCCE,demo.xml 也可以从 here 获得.

问题:

如果我注释掉 private MyJSlider _______BUG__BUG__BUG_______ = new MyJSlider(); 这行,它可以工作,但是当我使用它时,它会导致所有问题。我该如何解决?

import java.awt.*;
import java.net.URL;
import javax.swing.*;
import javax.swing.plaf.synth.SynthLookAndFeel;

public class YumYumYum {
//
// Step 1: using 2 class from here
//
private MyJSlider _______BUG__BUG__BUG_______ = new MyJSlider();
private static JFrame f = new JFrame();
public YumYumYum() {
f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
f.setLayout(new FlowLayout());
f.setPreferredSize(new Dimension(300, 200));
f.getContentPane().add(new JButton("Show me as Swing only - Then i am correct"));
f.pack();
f.setVisible(true);
}
public void test() {
Volume a = new Volume();
a.up(100);
}

public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
YumYumYum s = new YumYumYum();
s.test();
}
});
}

//
// Step 2: Creates the problem
//
public class MyJSlider extends JSlider {
public MyJSlider() {
try {
SynthLookAndFeel laf = new SynthLookAndFeel();
//laf.load(MyJSlider.class.getResourceAsStream("/ui/demo.xml"), MyJSlider.class);
laf.load(new URL("file:///var/tmp/demo.xml"));
UIManager.setLookAndFeel(laf);
} catch (Exception e) {
e.printStackTrace();
}
setOrientation(JSlider.VERTICAL);
//setMinimum(-24);
setMaximum(12);
setOpaque(false);
}
}

//
// Step 3: Does not show its actual user interface when Step 2 is involved
//
public class Volume extends JWindow {
private JPanel panelFirst;
private JProgressBar a;
public Volume() {
setLayout(new BorderLayout());
setBounds(10, 40, 350, 60);
panelFirst = new JPanel();
panelFirst.setBackground(Color.BLACK);
panelFirst.setLayout(new FlowLayout(FlowLayout.LEFT, 8,5));
a = createJP(100);
panelFirst.add(a);
add(panelFirst);
setVisible(true);
setAlwaysOnTop(true);
}

public JProgressBar createJP(int input) {
JProgressBar jp = new JProgressBar(JProgressBar.VERTICAL, 0, 100);
jp.setPreferredSize(new Dimension(15, 50));
jp.setValue(input);
jp.setBackground(Color.RED);
jp.setVisible(true);
return jp;
}
public void up(int input) {
a.setForeground(Color.GREEN);
}
}

}

跟进:

  • 在 Java 6 和 Java 7 中测试,在 Linux 中结果相同

最佳答案

我怀疑对 UIManager.setLookAndFeel 的调用与您的 UI 有问题(我在 Mac OSx 下对此进行了测试,没有任何问题...)

尝试在 invokeLater 调用之前在 main 方法中调用 setLookAndFeel...

public static void main(String[] args) {
SynthLookAndFeel laf = new SynthLookAndFeel();
//laf.load(MyJSlider.class.getResourceAsStream("/ui/demo.xml"), MyJSlider.class);
laf.load(new URL("file:///var/tmp/demo.xml"));
UIManager.setLookAndFeel(laf);
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
YumYumYum s = new YumYumYum();
s.test();
}
});
}

这可能有帮助

关于java - 如何解决这个错误,如果我使用一个类会导致其他类接口(interface)也被感染,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11568890/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com