2014-01-12 74 views
0

我有一些功能包()的問題,因爲我知道它應該將JFrame的大小設置爲最小。Java函數包(),JFrame大小

這裏是我的傑作:

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 

class Okno extends JFrame{ 
     public Okno(String naslov){ 
       setTitle(naslov); 
       setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       Toolkit tk = Toolkit.getDefaultToolkit(); 
       Dimension d = tk.getScreenSize(); 
       int sirina = d.width; 
       int visina = d.height; 
       setBounds(sirina/4,visina/4,sirina/2,visina/2); 
     } 
} 
public class Pretvori{ 
     public static class Plosca extends JPanel implements ActionListener{ 
       JTextField vnesiC , izracunajF; 
       protected void paintComponent(Graphics g) { 
         super.paintComponent(g); 

         vnesiC = new JTextField(8); 
         add(vnesiC); 

         add(new JLabel("\u00b0C")); 

         JButton pretvori = new JButton(" = "); 
         add(pretvori); 
         pretvori.addActionListener(this); 

         izracunajF = new JTextField(8); 
         izracunajF.setEditable(false); 
         add(izracunajF = new JTextField(8)); 

         add(new JLabel("F")); 
       } 
       public void actionPerformed(ActionEvent e) { 
         String c = vnesiC.getText(); 
         Double dc = Double.parseDouble(c); 
         Double df = 1.80 * dc + 32.0; 
         String f = String.format("%f", df); 
         izracunajF.setText(f); 
       } 
     } 
     public static void main(String[] args){ 
       Okno okno = new Okno("Pretvornik"); 
       okno.setLayout(new BorderLayout()); 
       Plosca p = new Plosca(); 
       okno.add(p); 
       okno.pack(); 
       okno.setResizable(false); 
       okno.setVisible(true); 
     } 
} 

下載鏈接:http://pastebin.com/download.php?i=kGkpCrHe

而且我的髒話抱歉。

回答

3

沒有,pack尺寸的框架內容首選大小(基於佈局管理器的要求),但由於你的Plosca沒有首選大小,它的返回0x0,因此你的框架認爲,首選大小是0x0

這...

protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 

     vnesiC = new JTextField(8); 
     add(vnesiC); 

     add(new JLabel("\u00b0C")); 

     JButton pretvori = new JButton(" = "); 
     add(pretvori); 
     pretvori.addActionListener(this); 

     izracunajF = new JTextField(8); 
     izracunajF.setEditable(false); 
     add(izracunajF = new JTextField(8)); 

     add(new JLabel("F")); 
} 

是不是你應該如何準備你的UI,paintComponent用於執行風俗畫,不會增加或更改UI。

相反,你應該開始從構造

public Plosca() { 
     vnesiC = new JTextField(8); 
     add(vnesiC); 

     add(new JLabel("\u00b0C")); 

     JButton pretvori = new JButton(" = "); 
     add(pretvori); 
     pretvori.addActionListener(this); 

     izracunajF = new JTextField(8); 
     izracunajF.setEditable(false); 
     add(izracunajF = new JTextField(8)); 

     add(new JLabel("F")); 
} 

內看看How to create a GUI with Swing更多細節加入您的組件......

3

的一個大問題是,你將組件添加到您的Plosca在每次致電paintComponent期間的實例。您應該將其添加到Plosca構造函數中。然後當你打電話給pack()時,它會有組件,所以它的首選大小不會太小。

public static class Plosca extends JPanel implements ActionListener{ 
    JTextField vnesiC , izracunajF; 
    public Plosca() { 
     vnesiC = new JTextField(8); 
     add(vnesiC); 

     add(new JLabel("\u00b0C")); 

     JButton pretvori = new JButton(" = "); 
     add(pretvori); 
     pretvori.addActionListener(this); 

     izracunajF = new JTextField(8); 
     izracunajF.setEditable(false); 
     add(izracunajF = new JTextField(8)); 

     add(new JLabel("F")); 
    } 

    // do not need paintComponent() 

    public void actionPerformed(ActionEvent e) { 
     . . . 
    } 
}