私の場合:
奇妙なバグがあります
次のような1つのメインクラスから2つのクラスを使用する必要があります。
両方のクラスを駆動する 1 つのメイン クラスは
YumYumYum
ユーザー インターフェイスのみである他の 2 つのクラスは次のとおりです。
a)
MyJSlider
メインのバグ作成者b)
Volume
黒いウィンドウに緑色のプログレス バーが表示される 2 番目のクラス
これで、SSCCE を 1 つのファイルで準備できました。demo.xml もここから入手できます。
問題:
行をコメントアウトする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 でも同じ結果になりました