1

私の場合

奇妙なバグがあります

ここに画像の説明を入力

次のような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 でも同じ結果になりました
4

2 に答える 2

0

この問題の代替回避策は次のとおりです。

ここに画像の説明を入力してください

Synthが好ましくない場所にこれを配置します。

  //
  // Step 3: Makeing this work
  //
  public class Volume extends JWindow {
    private JPanel panelFirst;
    private JProgressBar a;
    public Volume() {
      try {
                  // Set cross-platform Java L&F (also called "Metal")
              UIManager.setLookAndFeel(
                  UIManager.getCrossPlatformLookAndFeelClassName());
          } 
          catch (UnsupportedLookAndFeelException e) {
            // handle exception
          }
          catch (ClassNotFoundException e) {
            // handle exception
          }
          catch (InstantiationException e) {
            // handle exception
          }
          catch (IllegalAccessException e) {
            // handle exception
          }      
      setLayout(new BorderLayout());
      setBounds(40, 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.BLACK);
      jp.setVisible(true);
      return jp;  
    }
    public void up(int input) {
      a.setForeground(Color.GREEN);
    }
  }
于 2012-07-19T22:54:53.947 に答える
0

への呼び出しがUIManager.setLookAndFeelUI を台無しにしている可能性があります (これを Mac OSx でテストしましたが、問題はありませんでした...)

setLookAndFeel呼び出しの前にmainメソッドに呼び出しを配置し​​てみてくださいinvokeLater...

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();
      }
    });
}

それは役立つかもしれません

于 2012-07-19T21:27:12.977 に答える