2017-08-15 5 views
0

私はGUIを持っています。 GUIは、Panel [Gridbaglayout]を持つJFrameです。このグリッドバッグレイアウトには3つの異なるコンポーネントがあります。中央のコンポーネントは、私が話しているJLabelを持つパネル[GridBagLayout]です。また、JScrollBarも含まれています.JScrollBarは、ユーザーがバーを移動するときに値を取得し、JLabelを更新しています。JLabelを動的に更新するとGUIが歪みます - ウィンドウのサイズ変更後に動作します

私は値を取得し、JLabelのを更新するために使用しているコード:

public class DrinkAdjustmentListener implements AdjustmentListener{ 

    @Override 
    public void adjustmentValueChanged(AdjustmentEvent e) { 
     drinkLabel.setText("Percentage " + e.getValue() + "%"); 
    } 
} 

私は、Androidのためにコーディングするとき、メインスレッドは、同様のUIスレッドであることを理解。 Swingではそうは信じられませんし、実際にGUIを正しく更新する方法がわかりません。これはうまいですか、それは歪みを引き起こしている何か、おそらくレイアウトマネージャですか?

前:

Before

後:

After

これは私が達成しようとしていたものを実証し実行するためのいくつかのサンプルコードです。驚いたことにそれは働いた。私は問題を悪用するためにもっと長い例を作らなければならないでしょう。

public class Gui { 

private JLabel jLabel; 

public void displayGui(){ 

    JFrame jFrame = new JFrame(); 
    jFrame.setSize(500,500); 

    JPanel mainPanel = new JPanel(new GridBagLayout()); 
    mainPanel.setPreferredSize(new Dimension(400,400)); 

    jLabel = new JLabel("Some Percentage 0%"); 

    GridBagConstraints c = new GridBagConstraints(); 
    c.gridx = 0; 
    c.gridy = 0; 

    mainPanel.add(jLabel,c); 

    JScrollBar jScrollBar = new JScrollBar(); 
    jScrollBar.addAdjustmentListener(new MyAdjustmentListener()); 

    c = new GridBagConstraints(); 
    c.gridx = 0; 
    c.gridy = 1; 

    mainPanel.add(jScrollBar,c); 

    jFrame.add(mainPanel); 

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

public class MyAdjustmentListener implements AdjustmentListener{ 

    @Override 
    public void adjustmentValueChanged(AdjustmentEvent e) { 
     jLabel.setText("Some Percentage " + e.getValue() + "%"); 
    } 
} 

}

EDIT 2017年8月15日11:30 AM: 私は回避策を発見しました。私はウィンドウのサイズを変更すると、それ自体を再描画して正しいように見えたことが分かりました。 setTextがAdjustmentListenerで呼び出されるたびに、jFrame.repaint()を追加します。サイドノートでは、図に見られるようにGUI全体が「Options JPanel」内に再描画されているかのように見えました。

+4

問題を再現できるように、短い実行可能な例([SSCCE](http://sscce.org))を提供してください。 –

+0

'JLabelを動的に更新するとGUIが歪んでしまいます。 ' - 「歪み」が何を意味するのか分かりません。そのため、すべての質問に適切な[mcve]を投稿する必要があります。 – camickr

+0

@SergiyMedvynskyy私の例があります..問題は唯一の問題です..問題を悪用しようとしています – TheAppFoundry

答えて

3

スイングでは、ListenerがUIスレッド上で実行されます。つまり、adjustmentValueChanged,actionPerformedなどのメソッドから直接UI要素を更新することは安全です。

更新が別のスレッドから開始された場合のみ、SwingUtilities.invokeLater()などのメソッドを使用する必要があります。

関連する問題