2013-10-21 10 views
7

私はSwingのストップウォッチのためのこの作業コードを持っています。私は、ラベルTime Remaining 300 secondsを2行目の中央に置いておきたい。ここに私のコードです。 enter image description hereJLabelをJframe Swingに配置する方法は?

import java.awt.BorderLayout; 
import java.awt.GridLayout; 
import java.awt.Toolkit; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.Timer; 

public class TimerGUI extends JPanel { 
    JLabel promptLabel, timerLabel; 
    final int count = 30; 
    JButton start; 
    JButton end; 
    Timer timer; 

    public TimerGUI() { 
     setLayout(new GridLayout(0,2)); 

     start = new JButton("Start"); 
     add(start); 
     Event e = new Event(); 
     start.addActionListener(e); 

     end = new JButton("End"); 
     end.setEnabled(false); 
     add(end); 
     end.addActionListener(new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       timer.stop(); 
       start.setEnabled(true); 
       end.setEnabled(false); 
       timerLabel.setText("Time Remaining " + count + " seconds"); 

      } 

     }); 

     timerLabel = new JLabel("Time Remaining 300 seconds"); 
     add(timerLabel); 

    } 

    private class Event implements ActionListener { 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      start.setEnabled(false); 
      end.setEnabled(true); 
      timerLabel.setText("Time Remaining " + count + " seconds"); 

      TimeClass tc = new TimeClass(count); 
      timer = new Timer(1000, tc); 
      timer.start(); 

     } 
    } 

    private class TimeClass implements ActionListener { 
     int counter; 

     public TimeClass(int count) { 
      this.counter = count; 

     } 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      counter--; 
      if (counter <= 5) { 
       Toolkit.getDefaultToolkit().beep(); 
      } 

      if (counter >= 1) { 
       timerLabel.setText("Time Remaining " + counter + " seconds"); 
      } else { 
       timer.stop(); 
       timerLabel.setText("game over"); 
      } 

     } 
    } 

    public static void main(String[] args) { 
     JFrame myframe = new JFrame(); 
     TimerGUI timer = new TimerGUI(); 
     // myframe.getContentPane().add(content,BorderLayout.CENTER); 
     myframe.getContentPane().add(timer, BorderLayout.CENTER); 
     myframe.setTitle("Hangman Game"); 
     myframe.pack(); 
     myframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     myframe.setLocationRelativeTo(null); 
     myframe.setVisible(true); 

    } 

} 

EDIT: これに変更。

timerLabel = new JLabel("Time Remaining 300 seconds"); 
     add(timerLabel,SwingConstants.CENTER); 

は、親切に画像

enter image description here

答えて

12

変更あなたのJLabelの水平方向の配置を参照して、別の出力に含まを与えます。

timerLabel = new JLabel("Time Remaining 300 seconds"); 

へ:独自のレイアウトを使用して

timerLabel = new JLabel("Time Remaining 300 seconds", SwingConstants.CENTER); 

また巣あなたのJPanelを各コンストラクタは、変更することで、あなたがこれを行うことができます。例えば、

import java.awt.BorderLayout; 
import java.awt.GridLayout; 

import javax.swing.*; 

public class TimerFoo extends JPanel { 
    public TimerFoo() { 
     JPanel centerPanel = new JPanel(new GridLayout(0, 2)); 
     centerPanel.add(new JButton("Foo")); 
     centerPanel.add(new JButton("Bar")); 

     JLabel bottomLabel = new JLabel("Bottom Label", SwingConstants.CENTER); 

     int gap = 5; 
     setLayout(new BorderLayout(gap, gap)); 
     setBorder(BorderFactory.createEmptyBorder(gap, gap, gap, gap)); 
     add(centerPanel, BorderLayout.CENTER); 
     add(bottomLabel, BorderLayout.PAGE_END); 
    } 

    private static void createAndShowGui() { 
     JFrame frame = new JFrame("TimerFoo"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().add(new TimerFoo()); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      createAndShowGui(); 
     } 
     }); 
    } 
} 
+0

@ user1988876:レイアウトマネージャのより良い組み合わせを使用します。 GridLayoutはセンタリングを防止します。代わりにJPanelにBorderLayoutを使用させます。 JPanelsを入れ子にすることを検討してください。 –

+0

私は 'BorderLayout'で始めましたが、それはトータル・スポイラーのようです。 –

+0

@ user1988876:' 'トータル・スポイラー '' ???それは私にそれが何が悪いのかについての少しの手がかりを与える。繰り返しますが、JPanelを入れ子にしてレイアウトを入れ子にしない可能性があります。 –

2

JavaDoc of JLabelをお読みください。これには、クラスとすべてのAPI(テキストの配置など)の説明があります。

5

あなたが水平に

labelVariable.setHorizontalAlignment(JLabel.CENTER); 
+0

これは良い答えです。なぜなら、 'JLabel'がプライベートである場合にも働くからです。 +1その:) – CodingNinja

2

あなたがここに50を以下

jLabelvariable.setLocation((this.getWidth()-jLabelvariable.getWidth())/2,50); 

を使用することができ、それを中心にこれを使用することができますが、フレームの先頭からラベルの高さです。

関連する問題