2014-02-11 3 views
1

Я новый в Свинге. Я пытаюсь создать окно 800x600, которое будет разделено на две равные части (800x300): сначала - неизменяемая текстовая область, а вторая - кнопка.JButton игнорировать указанный размер

Задача: Кнопка должна занимать нижнюю половину окна. Но кажется, что размер кнопки не работает правильно.

Код:

import javax.swing.*; 
import javax.xml.parsers.ParserConfigurationException; 
import java.awt.*; 
import java.io.IOException; 
import java.util.Collections; 
import java.util.List; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

public class Main { 

    public static void main(String[] args) throws ParserConfigurationException, IOException, SAXException { 
     JFrame.setDefaultLookAndFeelDecorated(true); 
     final JFrame frame = new JFrame("Lingvo frame"); 
     frame.setPreferredSize(new Dimension(800, 600)); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     JPanel panel = new JPanel(new GridLayout(4,4,4,4)); 
     final JButton showResultButton = new JButton(); 
     showResultButton.setPreferredSize(new Dimension(800, 300)); 
     showResultButton.setHorizontalAlignment(SwingConstants.CENTER); 
     showResultButton.setVerticalAlignment(SwingConstants.BOTTOM); 

     frame.add(panel); 
     panel.add(showResultButton); 

     frame.pack(); 
     frame.setVisible(true); 

     showResultButton.addActionListener(new ActionListener() { 

      public void actionPerformed(ActionEvent arg0) { 
       showResultButton.setText("translation"); 
      } 
     }); 
    } 
} 

ответ

3

Просто установите рамку в GridLayout. Также обратите внимание, просто установите размер JTextArea с помощью этого конструктора JtextArea(rows, columns) и всего pack() ваш кадр. Не нужно устанавливать размер ни на что. GridLayout будет обрабатывать размер JButton для вас, в зависимости от размера JTextArea

Также приложение Swing должно запускаться из темы «Диспетчер событий». См. Initial Threads.

Также см. Laying out Components within a Container, чтобы узнать больше о менеджерах макетов.

Вот пример работает

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

public class Main { 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       JFrame.setDefaultLookAndFeelDecorated(true); 
       final JFrame frame = new JFrame("Lingvo frame"); 

       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

       final JButton showResultButton = new JButton(); 
       final JTextArea textArea = new JTextArea(20, 60); 

       frame.setLayout(new GridLayout(2, 1)); 
       frame.add(textArea); 
       frame.add(showResultButton); 

       frame.pack(); 
       frame.setVisible(true); 

       showResultButton.addActionListener(new ActionListener() { 

        public void actionPerformed(ActionEvent arg0) { 
         showResultButton.setText("translation"); 
        } 
       }); 
      } 
     }); 
    } 
} 
+0

спасибо, что это работает для меня –

+0

Можете ли вы выровнять текст выравнивания JTextArea в центре, пожалуйста? И установить какой-то красивый шрифт? –

+0

Что значит выровнять по центру? Также см. [** Как использовать шрифты **] (http://docs.oracle.com/javase/tutorial/2d/text/fonts.html). Как только вы узнаете об этом, просто используйте 'textArea.setFont (font)' –

1

панель, где кнопка вставляется имеет GridLayout(4,4,4,4). Это означает, что панель будет содержать 4 * 4 компонента, и все они будут иметь одинаковый размер (!).

Ваш код не содержит текстовой области на данный момент. Но, основываясь на описании, макет, вероятно, может быть достигнут с

panel.setLayout(new GridLayout(2,1)); 
panel.add(theTextArea); // The top half 
panel.add(button); // The bottom half 

Вы должны прочитать немного о компоновочные менеджер (http://docs.oracle.com/javase/tutorial/uiswing/layout/using.html), чтобы ознакомиться с ними. В частности, касается вопроса о том, как они учитывают «предпочтительный размер».

Смежные вопросы