2013-10-24 2 views
1

Я пишу программу, которая принимает некоторые уравнения от пользователя. Я хочу, чтобы каждая константа вводилась в JTextField, причем каждая из них разделялась JTextArea (говоря + x0, + x1 и т. Д.). Однако я не могу заставить форматирование работать, и я не уверен, почему. Вот соответствующий код:JTextArea Getting Cut Off in Swing

JTextField[][] dataTextFields = new JTextField[a+1][b+1]; 
JTextArea[][] dataLabels = new JTextArea[a][b+1]; 

for (int i = 0; i < a+1; i++) 
{ 
    for (int j = 0; j < b+1; j++) 
    { 
     dataTextFields[i][j] = new JTextField(10); 
     dataTextFields[i][j].setLocation(5+70*i, 10+30*j); 
     dataTextFields[i][j].setSize(40,35); 
     dataEntryPanel.add(dataTextFields[i][j]); 

     if (i < a) 
     { 
      String build = "x" + Integer.toString(i) + "+"; 
      dataLabels[i][j] = new JTextArea(build); 
      dataLabels[i][j].setBackground(dataEntryPanel.getBackground()); 
      dataLabels[i][j].setBounds(45+70*i,20+30*j,29,30); 
      dataEntryPanel.add(dataLabels[i][j]); 
     } 
    } 
} 

Это создает JTextFields с JTextAreas 0f "+ хи" между ними. Тем не менее, когда я запускаю апплет, это выглядит следующим образом:

enter image description here

я могу нажать на этикетках и вывести их на передний план, по-видимому, в результате чего в этом:

enter image description here

Я бы хотел, чтобы ярлыки были видны без каких-либо усилий от пользователя, очевидно. У JTextArea есть атрибут, который можно изменить, чтобы перенести это на передний план? Я бы предпочел не добавлять больше элементов интерфейса (панели, контейнеры и т. Д.). Благодаря!

+1

Я подозреваю, что происходит то, что вы в основном писали свой собственный менеджер компоновки, указав точные границы для каждого компонента. Я сомневаюсь, что код рисования/рендеринга/макета Swing относится к этому, так как он пытается делегировать это любому менеджеру компоновки, уже присутствующему на компоненте. Вы пытались использовать что-то вроде GridLayout или GridBagLayout, чтобы понять, решает ли ваша проблема? Или, может быть, серия FlowLayouts внутри GridBag, чтобы каждый поток отображался непосредственно под предыдущим, предоставляя вам строки таких компонентов, как у вас на скриншоте. –

+0

какой макет вы используете? пожалуйста, добавьте соответствующий код для JLabel тоже – Sage

+0

@Sage, я оговорился. Я фактически закончил использование JTextArea вместо JLabel; Я не мог заставить JLabels вообще появиться. – aquemini

ответ

0

Я бы разместил контейнер, используя GridBagLayout. GridBagLayout очень похож на таблицы HTML, где у вас разные ячейки, которые растут по высоте и ширине, чтобы наиболее эффективно использовать контент. Для вашего конкретного макета, то, как это будет работать:

public class SwingTest extends JFrame { 
    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       new SwingTest().setVisible(true); 
      } 
     }); 
    } 

    public SwingTest() { 
     super("Swing Test"); 

     JPanel contentPane = new JPanel(new GridBagLayout()); 
     GridBagConstraints gbc = new GridBagConstraints(); 
     gbc.gridy = 0; 

     contentPane.add(createJTextField(), gbc.clone()); 
     contentPane.add(new JLabel("x0+"), gbc.clone()); 
     contentPane.add(createJTextField(), gbc.clone()); 

     // go to next line 
     gbc.gridy++; 

     contentPane.add(createJTextField(), gbc.clone()); 
     contentPane.add(new JLabel("x0+"), gbc.clone()); 
     contentPane.add(createJTextField(), gbc.clone()); 

     setContentPane(contentPane); 

     pack(); 
     setDefaultCloseOperation(DISPOSE_ON_CLOSE); 
     setLocationRelativeTo(null); 
    } 

    private JTextField createJTextField() { 
     JTextField textField = new JTextField(4); 
     textField.setMinimumSize(textField.getPreferredSize()); 
     return textField; 
    } 
} 

GridBagLayout является наиболее сложным (но гибкий) раскладки, и требует много параметров для настройки. Существуют более простые, такие как FlowLayout, BorderLayout, GridLayout и т. Д., Которые могут использоваться совместно друг с другом для достижения сложных макетов.

В Swing Tutorial есть очень хороший раздел на Laying Out Components. Если вы планируете потратить значительное количество времени на создание графического интерфейса Swing, это может быть полезно прочитать.

Обратите внимание, что есть один странный нюанс с GridBagLayout: если вы собираетесь использовать JTextField в GridBagLayout, есть один глупый вопрос (описанный here), что приводит к их визуализации в их минимальных размерах, если они не могут быть предоставлены по их предпочтительным размерам (что заставляет их проявляться как крошечные разрезы). Чтобы преодолеть это, я указываю количество столбцов в моем конструкторе JTextField, чтобы минимум был чем-то разумным, а затем задал минимальный размер для предпочтительного размера.