Используя JTabbedPane и JScrollPane

Когда вы видите код, я бы хотел реализовать вторую вкладку с текстовой областью, прокруткой и кнопкой там. Это (JScrollPane scr = new JScrollPane(secondTab(panel2));) код находился в функции, private static JTextArea secondTab(JPanel panel) раньше, но я вынул ее из функции и вернул ее в MainFrame. Потому что область прокрутки и текста не отображалась. Теперь, когда я переместил код в mainframe таре и теги tex видны, но я изо всех сил пытаюсь заставить кнопку отображаться во второй вкладке. У вас есть идеи?

public MainFrame(String username)
{

 JTabbedPane tab = new JTabbedPane();
 mainFrame.add(tab, BorderLayout.CENTER);

 JPanel panel1 = new JPanel();
 firstTab(panel1);
 tab.add("babababa", panel1);


 JPanel panel2 = new JPanel();
 JScrollPane scr = new JScrollPane(secondTab(panel2));
 JButton saveButton = new JButton("Save");
 panel2.add(saveButton);
 saveButton.setBounds(190, 280, 80, 40);

 tab.add("hahaha", panel2.add(scr));

 mainFrame.setBounds(200,200,500,400);
 mainFrame.setVisible(true);
}

private static JTextArea secondTab(JPanel panel) {
 panel.setLayout(null);

 final JTextArea nameTextArea=new JTextArea();
 nameTextArea.setBounds(10,10,440,270);
 nameTextArea.setLineWrap(true);

 return nameTextArea;

}

}

2 ответа

Вам следует избегать использования нулевого макета, поскольку это создает очень негибкий графический интерфейс, который, хотя они могут выглядеть хорошо на одной платформе, выглядит ужасно на большинстве других платформ или разрешениях экрана, которые очень сложно обновить и поддерживать. Мало того, JScrollPanes не работает, когда представление viewport (компонент, отображаемый внутри JScrollPane) использует нулевой макет. Не только это, если вы установите границы или даже предпочтительный размер JTextArea, он не будет расширяться внутри JScrollPane, и вы не увидите полосы прокрутки.

Решение:

  1. Избегайте использования нужных макетов, таких как чума.
  2. Изучите и используйте менеджеров макетов: Учебники Менеджера Swing Layout
  3. Никогда не устанавливайте размер JTextArea или предпочитаемый размер. Вместо этого рассмотрите настройку своих столбцов и строк.

Например:

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

public class MainFrame2 extends JPanel {

 private JTabbedPane tabbedPane = new JTabbedPane();
 private JTextArea textArea = new JTextArea(20, 40);

 public MainFrame2() {
 tabbedPane.add("Bahahahaha", new JPanel());
 tabbedPane.add("TextArea Info", createTextAreaPane());

 setLayout(new BorderLayout());
 add(tabbedPane, BorderLayout.CENTER);
 }

 private JComponent createTextAreaPane() {
 JPanel btnPanel = new JPanel();
 btnPanel.add(new JButton("Save"));

 JPanel textAreaPane = new JPanel(new BorderLayout());
 textAreaPane.add(new JScrollPane(textArea), BorderLayout.CENTER);
 textAreaPane.add(btnPanel, BorderLayout.SOUTH);
 return textAreaPane;
 }

 private static void createAndShowGui() {
 MainFrame2 mainPanel = new MainFrame2();

 JFrame frame = new JFrame("Main Frame");
 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 frame.getContentPane().add(mainPanel);
 frame.pack();
 frame.setLocationByPlatform(true);
 frame.setVisible(true);
 }

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


Лучше создавать каждую панель вкладок в каждом методе.

private JPanel buildFirstTab() {
// create new panel
// add components to the panel
// return the panel
}

 private JPanel buildSecondTab() {
// create new panel
// create JScrollPane
// create JTextArea
// add text area to scrollpane by calling scrollpane.setViewPort method
// add scrollpane to the panel
// create button
// add button to the panel
// return the panel
}


public MainFrame(String username) {
 JTabbedPane tab = new JTabbedPane();
 mainFrame.add(tab, BorderLayout.CENTER);
 tab.add("1st tab", buildFirstTab());
 tab.add("2nd tab", buildSecondTab());
 mainFrame.setBounds(200,200,500,400);
 mainFrame.setVisible(true);
}

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

licensed under cc by-sa 3.0 with attribution.