2017-11-03 17 views
-1

JavaのSwingライブラリに問題があります。私はAdmission ClassJTabbedPaneに追加しました。以下はJTabbedPaneがButtonおよびComboBoxと正常に動作しない

は、私がこれまで試してみました何で...最初のタブ上ButtonComboBoxコンポーネントが動作していないように見えるけど、私はsetLayout(null)を削除すると、それが動作しているようですが、これは、レイアウトを持つ他の問題につながります:

DBProjectPractice.java

import java.awt.BorderLayout; 
import java.awt.Container; 
import java.awt.Font; 
import java.awt.Graphics; 
import java.awt.GridLayout; 
import java.text.SimpleDateFormat; 
import java.util.Date; 
import javax.swing.ImageIcon; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JTabbedPane; 
import javax.swing.SwingConstants; 
public class DBProjectPractice extends JFrame { 
    private Container contentPane; 
    private String User = null; 
    public String getUser() { 
     String user = this.User; 
     return user; 
    } 
    public DBProjectPractice() { 
     // TODO Auto-generated constructor stub 
     init(); 
    } 
    JTabbedPane pane = new JTabbedPane(); 
    JTabbedPane createTabbedPane() { // tab pane init 
     pane.addTab("text", new Admission());  // 입사 탭의 레이아웃. 
     pane.addTab("text", new JLabel("text.", JLabel.CENTER)); 
     pane.addTab("text", new JLabel("text.", JLabel.CENTER)); 
     pane.addTab("text", new JLabel("text.", JLabel.CENTER)); 
     return pane; 
    } 
    public void init() { 
     contentPane = this.getContentPane(); 
     contentPane.setLayout(new BorderLayout(30, 30)); 
     setTitle("text"); 
     setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     JTabbedPane jtabbedpane = createTabbedPane(); 
     contentPane.add(new Top(), BorderLayout.NORTH);    
     contentPane.add(jtabbedpane, BorderLayout.CENTER); 
     setLocationByPlatform(true); 
     setSize(1600, 1000); // 사이즈 설정 // 가로 세로 
     setVisible(true); // 표시 
    } 
    public static void main(String[] args) { 
     // TODO Auto-generated method stub 
     new DBProjectPractice(); 
    } 
} 

Top.java

import java.awt.Font; 
import java.awt.Graphics; 
import java.text.SimpleDateFormat; 
import java.util.Date; 
import javax.swing.JPanel; 
class Top extends JPanel{ 
    @Override 
    protected void paintComponent(Graphics g) { 
     // TODO Auto-generated method stub 
     super.paintComponent(g); 
     Date date = new Date(); 
     SimpleDateFormat text = new SimpleDateFormat("yyyy/MM/dd hh:mm:ss");  
     Font f = new Font("Times", Font.BOLD, 15); 
     g.setFont(f);   
     g.drawString("text : " , 100, 25); 
     g.drawString("text : " + text.format(date), 1200, 25); 
     this.setSize(1600, 30); 
    } 
} 

Admission.java

import java.awt.Color; 
import java.awt.Container; 
import java.awt.Font; 
import java.awt.Graphics; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.JButton; 
import javax.swing.JComboBox; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JOptionPane; 
import javax.swing.JPanel; 
import javax.swing.SwingConstants; 
import javax.swing.border.EtchedBorder; 
public class Admission extends JPanel { 
    private Container pane; 
    public Admission() { 
     // TODO Auto-generated constructor stub 
     setLayout(null); 
     Admission_Button(); 
     FixLable_JLabel(); 
     ComboBox(); 
    } 
    protected void paintComponent(Graphics g) { 
     // TODO Auto-generated method stub 
     super.paintComponent(g); 
     Font f = new Font("Times", Font.BOLD, 15); // 글꼴 설정 
     g.setFont(f); // 글꼴 지정 
     g.drawString(":::: text ::::", 100, 100); 
     g.drawString(":::: text ::::", 100, 500); 
     this.setSize(1600, 30); 
    } 
    private void Admission_Button() { // 입사 탭의 레이아웃의 버튼 
     JButton[] Button = new JButton[3]; 
     Button[0] = new JButton(" text "); 
     Button[1] = new JButton(" text "); 
     Button[2] = new JButton(" text "); 
     for(int i = 0; i < 3; i++) { 
     Button[i].setSize(100,40); 
     Button[i].setLocation(1065 + i * 120, 130); 
     add(Button[i]); 
     } 
    } 
    private void FixLable_JLabel() { 
     JLabel[] FixLabel = new JLabel[15]; // 고정된 label; 
     String[] FixLabelName = { "text", "text", "text","text","text","text","text","text","text","text", 
     "text","text","text","text","text"}; 
     EtchedBorder eb = new EtchedBorder(Color.BLACK, Color.GRAY); // 테두리를 넣는다. 
     int FixLableIndex = 0; 
     for (String name : FixLabelName) { 
     FixLabel[FixLableIndex] = new JLabel(name); 
     FixLabel[FixLableIndex].setHorizontalAlignment(SwingConstants.CENTER); // 가운대 정렬 
     FixLabel[FixLableIndex].setBorder(eb);         // 테두리 추가 
     FixLabel[FixLableIndex++].setSize(120, 30); 
     } 
     for(int i = 0 ; i < 7 ; i++) { 
     FixLabel[i].setLocation(100,200 + i * 30); 
     } 
     int t = 0; 
     for(int i = 7 ; i < 10 ; i++) { 
     FixLabel[i].setLocation(550,230 + t++ * 30); 
     } 
     FixLabel[10].setLocation(550, 350); 
     t = 0; 
     for(int i = 11 ; i < 14 ; i++) { 
     FixLabel[i].setLocation(1050,230 + t++ * 30); 
     } 
     FixLabel[14].setLocation(1050, 350); 
     for(int i = 0 ; i < 15; i++) { 
     add(FixLabel[i]); 
     } 
    } 
    private void ComboBox() { 
     String[] type = {"text", "text","text","text"}; 
     JComboBox<String> typeCombo = new JComboBox<String>(); 
     int num = type.length; 
     for(int i = 0 ; i < num ; i++) { 
     typeCombo.addItem(type[i]); 
     } 
     typeCombo.setBounds(220, 200, 1200, 30); 
     typeCombo.setSelectedItem(2); 
     add(typeCombo); 
     setVisible(true); 
    } 
} 
+4

解決方法:nullレイアウトは使用しないでください。ヌルレイアウトと 'setBounds()'はSwingの初心者にとっては複雑なGUIを作成する最も簡単で最良の方法のように思えるかもしれませんが、Swing GUIを使用すると、より多くの深刻な問題が発生します。 GUIのサイズが変更されるとコンポーネントのサイズが変更されず、拡張または維持するロイヤルウィジェットであり、スクロールペインに配置されたときには完全に失敗し、元のプラットフォームとは異なるすべてのプラットフォームまたは画面解像度ではひどく見えます。 –

+0

これはあなたのGUIがフリーズしていて応答していない理由ではありません。これの説明については下記の答えをご覧ください。 –

答えて

1

(私に)あなたの最大の問題は、あなたが独自のpaintComponent方法、塗装方法の中に、あなたのコンポーネント上setSize(...)を呼んでいるということのようだ:

protected void paintComponent(Graphics g) { 
    super.paintComponent(g); 
    Font f = new Font("Times", Font.BOLD, 15); 
    g.setFont(f); 
    g.drawString(":::: text ::::", 100, 100); 
    g.drawString(":::: text ::::", 100, 500); 
    this.setSize(1600, 30); // **** HERE **** 
} 

は、ほぼ再帰的にの再描画を呼び出すので、再描画でコンポーネントのサイズを変更しようとする可能性があるため、これは正しくなく、実際には危険です。また、設定しているサイズは、このJPanelが保持するGUIを30の高さで表示することはできないため、不合理です。これをしないでください。

ベター:

  • コンポーネントのコンストラクタ内setSize(...)を経由して、一度サイズを設定します。
  • 代わりに、コンストラクタ内でsetPreferredSize(Dimension d)を呼び出して優先サイズを設定することをお勧めします。
  • 代わりに、コンポーネントクラスのgetPreferredSize()をオーバーライドすることもできます。

あなたの他の問題は、あなたがnullのレイアウトを使用していることです。繰り返しますが、ヌルレイアウトとsetBounds()は複雑なGUIを作成する最も簡単で最良の方法のようにSwing初心者のように思えるかもしれませんが、Swing GUIを使用すると、より多くの深刻な問題が発生します。 GUIのサイズが変更されたときにコンポーネントのサイズを変更することはありません。これらのコンポーネントは、拡張または維持するロイヤルウィジェットであり、スクロールペインに配置すると完全に失敗し、元のプラットフォームとは異なるすべてのプラットフォームまたは画面解像度で表示されます。

+0

ありがとうございました。 Java GUIについて勉強します。ヌルレイアウトを使わずに実装します。 –

関連する問題