Java: JScrollPane满了就消失
Java: JScrollPane disappears when it is full
我想查看有关我程序的某些对象的一些信息。为此,我正在为每个对象创建一个 JPanel 及其信息。这些面板一起打包在我添加到 ScrollPane 的面板中。
如果只有几个对象,则效果完美,因此无需滚动即可显示所有信息。一旦有更多,整个面板就会以最小化的方式消失。
很抱歉,我无法提取小代码片段来重现错误。我把它做得尽可能小。所以我必须给你三个类:
Program:创建对象的 TreeMap 并对其进行处理。这里只是初始化一个整数列表。
import java.util.TreeMap;
public class Program {
// Set ObjectNumber here!
static int numberObjects = 32;
static TreeMap<Integer, Integer> objects = new TreeMap<Integer, Integer>();
static TestFrame frame;
public static void main(String[] args) {
init();
}
public static void init() {
for (int i=0; i < numberObjects; i++) {
objects.put(i, i);
}
frame = new TestFrame(objects);
frame.repaint();
}
}
TestFrame: 它扩展了 JFrame,将其自身设置为最大化和边框布局。之后,它从我的 class TestPanel 向东添加了一个 JPanel。
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Frame;
import java.util.TreeMap;
import java.awt.GridLayout;
import java.awt.Toolkit;
import java.util.TreeMap;
import javax.swing.JFrame;
public class TestFrame extends JFrame {
TreeMap<Integer, Integer> objects;
TestPanel testPanel;
public TestFrame(TreeMap<Integer, Integer> objects) {
this.objects = objects;
setTitle("Program");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setExtendedState(Frame.MAXIMIZED_BOTH);
init();
}
public void init() {
setLocationRelativeTo(null);
setLayout(new BorderLayout());
testPanel = new TestPanel(objects);
this.add(testPanel, BorderLayout.EAST);
setVisible(true);
}
}
TestPanel:它扩展了 JPanel。遍历所有对象并将具有整数值的标签添加到数组名称[]。然后再次为每个对象构建一个只为此对象的面板,添加一个带有文本 "Name:" 和来自名称 [] 数组的标签的面板。使用 GridBagLayout。
现在它将对象的所有面板打包在一个面板中 "innerPanel"。这被添加到滚动窗格中。滚动窗格被添加到 class (TestPanel)。
import java.util.TreeMap;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.SwingConstants;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.Label;
import javax.swing.BorderFactory;
public class TestPanel extends JPanel {
GridBagConstraints gridBagConstraints = new GridBagConstraints();
TreeMap<Integer, Integer> objects;
Label[] names;
JPanel[] objectPanel;
JPanel innerPanel;
Font fontLabelName = new Font("Arial", Font.BOLD, 20);
public TestPanel (TreeMap<Integer, Integer> objects) {
this.objects = objects;
names = new Label[objects.size()];
objectPanel = new JPanel[objects.size()];
this.setLayout(new GridBagLayout());
for(int i=0; i<objects.size(); i++) {
Label tempLabel = new Label(Integer.toString(objects.get(i)), SwingConstants.LEFT);
tempLabel.setFont(fontLabelName);
names[i]=tempLabel;
}
for (int i=0; i<objects.size(); i++) {
JPanel tempPanel = new JPanel();
tempPanel.setLayout(new GridBagLayout());
objectPanel[i] = tempPanel;
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 0;
gridBagConstraints.gridwidth = 2;
gridBagConstraints.gridheight = 1;
Label nameLabel = new Label("Name: ", SwingConstants.LEFT);
nameLabel.setFont(fontLabelName);
objectPanel[i].add(nameLabel, gridBagConstraints);
gridBagConstraints.gridx = 2;
gridBagConstraints.gridy = 0;
gridBagConstraints.gridwidth = 2;
gridBagConstraints.gridheight = 1;
objectPanel[i].add(names[i], gridBagConstraints);
}
innerPanel = new JPanel();
innerPanel.setLayout(new GridLayout(0,1));
for (int i = 0; i<objects.size(); i++) {
innerPanel.add(objectPanel[i]);
}
JScrollPane scrollPane = new JScrollPane(innerPanel);
// scrollPane.setBorder( BorderFactory.createEmptyBorder() );
scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
this.add(scrollPane);
}
}
如屏幕截图所示,我的屏幕分辨率为 31 个对象,效果完美,但如果我使用 32 个对象,滚动窗格几乎消失。
如果有人能帮助我解决它或 link 一个匹配的 post,我将非常感激 - 我找不到 google/search。
尝试在您的测试面板中设置不同的布局。 BorderLayout 是一个不错的选择,如果您打算只在面板中添加一个对象(在您的例子中是 scollpane),并且您希望该对象占据面板的所有 space。
this.setLayout(new BorderLayout());
我想查看有关我程序的某些对象的一些信息。为此,我正在为每个对象创建一个 JPanel 及其信息。这些面板一起打包在我添加到 ScrollPane 的面板中。
如果只有几个对象,则效果完美,因此无需滚动即可显示所有信息。一旦有更多,整个面板就会以最小化的方式消失。
很抱歉,我无法提取小代码片段来重现错误。我把它做得尽可能小。所以我必须给你三个类:
Program:创建对象的 TreeMap 并对其进行处理。这里只是初始化一个整数列表。
import java.util.TreeMap;
public class Program {
// Set ObjectNumber here!
static int numberObjects = 32;
static TreeMap<Integer, Integer> objects = new TreeMap<Integer, Integer>();
static TestFrame frame;
public static void main(String[] args) {
init();
}
public static void init() {
for (int i=0; i < numberObjects; i++) {
objects.put(i, i);
}
frame = new TestFrame(objects);
frame.repaint();
}
}
TestFrame: 它扩展了 JFrame,将其自身设置为最大化和边框布局。之后,它从我的 class TestPanel 向东添加了一个 JPanel。
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Frame;
import java.util.TreeMap;
import java.awt.GridLayout;
import java.awt.Toolkit;
import java.util.TreeMap;
import javax.swing.JFrame;
public class TestFrame extends JFrame {
TreeMap<Integer, Integer> objects;
TestPanel testPanel;
public TestFrame(TreeMap<Integer, Integer> objects) {
this.objects = objects;
setTitle("Program");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setExtendedState(Frame.MAXIMIZED_BOTH);
init();
}
public void init() {
setLocationRelativeTo(null);
setLayout(new BorderLayout());
testPanel = new TestPanel(objects);
this.add(testPanel, BorderLayout.EAST);
setVisible(true);
}
}
TestPanel:它扩展了 JPanel。遍历所有对象并将具有整数值的标签添加到数组名称[]。然后再次为每个对象构建一个只为此对象的面板,添加一个带有文本 "Name:" 和来自名称 [] 数组的标签的面板。使用 GridBagLayout。 现在它将对象的所有面板打包在一个面板中 "innerPanel"。这被添加到滚动窗格中。滚动窗格被添加到 class (TestPanel)。
import java.util.TreeMap;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.SwingConstants;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.Label;
import javax.swing.BorderFactory;
public class TestPanel extends JPanel {
GridBagConstraints gridBagConstraints = new GridBagConstraints();
TreeMap<Integer, Integer> objects;
Label[] names;
JPanel[] objectPanel;
JPanel innerPanel;
Font fontLabelName = new Font("Arial", Font.BOLD, 20);
public TestPanel (TreeMap<Integer, Integer> objects) {
this.objects = objects;
names = new Label[objects.size()];
objectPanel = new JPanel[objects.size()];
this.setLayout(new GridBagLayout());
for(int i=0; i<objects.size(); i++) {
Label tempLabel = new Label(Integer.toString(objects.get(i)), SwingConstants.LEFT);
tempLabel.setFont(fontLabelName);
names[i]=tempLabel;
}
for (int i=0; i<objects.size(); i++) {
JPanel tempPanel = new JPanel();
tempPanel.setLayout(new GridBagLayout());
objectPanel[i] = tempPanel;
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 0;
gridBagConstraints.gridwidth = 2;
gridBagConstraints.gridheight = 1;
Label nameLabel = new Label("Name: ", SwingConstants.LEFT);
nameLabel.setFont(fontLabelName);
objectPanel[i].add(nameLabel, gridBagConstraints);
gridBagConstraints.gridx = 2;
gridBagConstraints.gridy = 0;
gridBagConstraints.gridwidth = 2;
gridBagConstraints.gridheight = 1;
objectPanel[i].add(names[i], gridBagConstraints);
}
innerPanel = new JPanel();
innerPanel.setLayout(new GridLayout(0,1));
for (int i = 0; i<objects.size(); i++) {
innerPanel.add(objectPanel[i]);
}
JScrollPane scrollPane = new JScrollPane(innerPanel);
// scrollPane.setBorder( BorderFactory.createEmptyBorder() );
scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
this.add(scrollPane);
}
}
如屏幕截图所示,我的屏幕分辨率为 31 个对象,效果完美,但如果我使用 32 个对象,滚动窗格几乎消失。
如果有人能帮助我解决它或 link 一个匹配的 post,我将非常感激 - 我找不到 google/search。
尝试在您的测试面板中设置不同的布局。 BorderLayout 是一个不错的选择,如果您打算只在面板中添加一个对象(在您的例子中是 scollpane),并且您希望该对象占据面板的所有 space。
this.setLayout(new BorderLayout());