Jscrollpane не для для jpanel внутри jpanel по
Прочитавэтот ответ , я пришел к, используя getPreferredSize вместо setPreferredSize . Но я все еще не могу использовать @Override getPreferredSize
, но это не главная проблема, с которой я сейчас сталкиваюсь.
Меня CardLayout
приложения, которое вызывает класс с именем HiraganaData
HiraganaData - это класс, который расширяет JPanel
, поэтому он может использоваться CardLayout
, но он также имеет еще 2 JPanel
s на нем, один для кнопки" назад " и один для остальных кнопок, перед использованием этой идеи я использовал JTable, но столкнулся с проблемами при создании ячеек в качестве кнопок, поэтому я отказался от этой идеи и пришел с этим новым, используя GridLayout
. Некоторые кнопки будут отключены, в любом случае я могу это сделать и не буду включать этот код, поскольку он не имеет отношения к делу.
- Как я могу добавить a
JScrollPane
только кbuttonsPanel
, сделал все возможное попытка добавить его даже ко всей "глобальной" панели без успеха.
Это самое aproximate GUI я могу сделать с тем же кодом моего класса, который я только что добавил в него JFrame.
Не уверен, что это уместно, но я использую CardLayout
с разными размерами, как @MadProgrammer предложил на этот ответ.
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.io.*;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.*;
import javax.swing.table.TableCellRenderer;
import javax.swing.DefaultCellEditor;
import java.awt.Dimension;
public class HiraganaPage extends JPanel {
JFrame frame = new JFrame("Hello");
JButton kanas[][] = new JButton[26][5];
JButton backButton = new JButton("back");
JPanel backPanel = new JPanel();
JPanel buttonsPanel = new JPanel();
public static void main(String args[]) {
new HiraganaPage();
}
public HiraganaPage() {
JPanel pane = new JPanel();
backPanel.add(backButton);
buttonsPanel.setLayout(new GridLayout(0, 5));
pane.setLayout(new BoxLayout(pane, BoxLayout.Y_AXIS));
pane.add(backPanel);
//pane.setPreferredSize(new Dimension(500, 500));
for (int i = 0; i < 26; i++) {
for (int j = 0; j < 5; j++) {
kanas[i][j] = new JButton("1");
buttonsPanel.add(kanas[i][j]);
}
}
JScrollPane scroll = new JScrollPane(buttonsPanel);
pane.add(buttonsPanel);
this.add(pane, BorderLayout.CENTER);
frame.add(this);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocation(50, 50);
frame.setSize(300, 300);
}
}
Вот как это выглядит в моем полном приложении
И вот как это выглядит в MCVE.
1 ответ:
Основная проблема, с которой вы столкнулись, заключается в том, что вы удаляете
buttonsPane
из области прокрутки, когда добавляете его вpane
...JScrollPane scroll = new JScrollPane(buttonsPanel); pane.add(buttonsPanel); this.add(pane, BorderLayout.CENTER);
И тот факт, что вы никогда не добавляете панель прокрутки ни к чему, тоже не помогает.
Компонент может иметь только одного родителя, поэтому при добавлении
buttonsPane
кpane
он эффективно удаляется из области прокруткиВместо этого установите диспетчер компоновки
HiraganaPage
вBorderLayout
, добавьтеbuttonsPanel
в область прокрутки и добавьте прокрутку панель в положениеCENTER
HiraganaPage
затем добавьтеpane
в положениеNORTH
HiraganaPage
import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.EventQueue; import java.awt.GridLayout; import javax.swing.BoxLayout; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.UIManager; import javax.swing.UnsupportedLookAndFeelException; public class TestScrollPane { public static void main(String[] args) { new TestScrollPane(); } public TestScrollPane() { EventQueue.invokeLater(new Runnable() { @Override public void run() { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { } JFrame frame = new JFrame("Testing"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setLayout(new BorderLayout()); frame.add(new HiraganaPage()); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); } }); } public class HiraganaPage extends JPanel { JFrame frame = new JFrame("Hello"); JButton kanas[][] = new JButton[26][5]; JButton backButton = new JButton("back"); JPanel backPanel = new JPanel(); JPanel buttonsPanel = new JPanel(); public HiraganaPage() { setLayout(new BorderLayout()); JPanel pane = new JPanel(); backPanel.add(backButton); buttonsPanel.setLayout(new GridLayout(0, 5)); pane.setLayout(new BoxLayout(pane, BoxLayout.Y_AXIS)); pane.add(backPanel); // pane.setPreferredSize(new Dimension(500, 500)); for (int i = 0; i < 26; i++) { for (int j = 0; j < 5; j++) { kanas[i][j] = new JButton("1"); buttonsPanel.add(kanas[i][j]); } } add(pane, BorderLayout.NORTH); add(new JScrollPane(buttonsPanel)); } @Override public Dimension getPreferredSize() { return new Dimension(500, 500); } } }