gpt4 book ai didi

java - 为什么一旦我改变窗口大小,Swing 应用程序的视口(viewport)大小也会发生变化?

转载 作者:行者123 更新时间:2023-12-02 03:35:39 25 4
gpt4 key购买 nike

我正在尝试在我的 swing 应用程序中应用scrollPane。
但是一旦改变窗口的大小,我就看不到滚动条了。

我知道滚动 Pane 中有 9 个组件:视口(viewport)、2 个标题、2 个滚动条和 4 个角。但是当我将边框颜色设置为红色(应用于视口(viewport))时,结果显示我的唯一元素窗口只是视口(viewport)。(因为窗口周围都是红色边框。)

这是我的代码。

package swingDemo;

import java.awt.Color;
import java.awt.Dimension;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.SwingUtilities;;

public class ScrollDemo1 extends JFrame{

public ScrollDemo1() {
JLabel label = new JLabel();
label.setBounds(50,0,1000,100);
label.setText("Do you want to have a coffee together?");

JButton button = new JButton("Of course!");
button.setBounds(10,60,150,50);
button.addActionListener(e -> label.setText("Well, let's go!"));
JButton button2 = new JButton("No,sorry.");
button2.setBounds(170,60,150,50);
button2.addActionListener(e -> label.setText("Well, let's go!"));

JPanel panel = new JPanel();
panel.setBounds(10,10,10,10);
panel.add(button2);
panel.add(button);
panel.add(label);
panel.setLayout(null);

JScrollPane scrollPane = new JScrollPane(panel);
scrollPane.setViewportBorder(BorderFactory.createLineBorder(Color.red));
scrollPane.setPreferredSize(new Dimension(20,20));
add(scrollPane);
scrollPane.setViewportView(panel);
setBounds(10,10,40,60);
setTitle("Dating Robot");

}

public static void main(String[] args) {
// TODO Auto-generated method stub
SwingUtilities.invokeLater(() -> {
ScrollDemo1 obj = new ScrollDemo1();
obj.setVisible(true);
});

}

}

我想看看滚动条。请问有人吗?谢谢!

最佳答案

代码存在一些问题,此示例应该可以解决其中一些问题。

主要问题是由将布局管理器设置为null引起的。当滚动 Pane 尝试获取所包含面板的大小时,它无法获得好的答案,因此无法显示滚动条。

您可能已经注意到,所有内容实际上都在屏幕上,只是全部被挤压了。通过设置大小,一切都可见。

通过注释掉 setLayout(null),我可能破坏了您想要的视觉布局,因此请根据口味进行调整。不过,最好使用其中一种布局管理器。

scrollPane.setViewportView(panel) 的调用是不必要的,因为当您调用 new JScrollPane(panel) 时,该调用已经在构造函数中进行了处理。这可能是良性的,但正是这些冗余调用有时会导致 Swing 异常,因为 Swing 经常在幕后注册监听器等。

最后,我添加了对 setDefaultCloseOperation 的调用,以便应用程序在单击窗口关闭按钮时退出。

希望这会有所帮助!

package swingDemo;

import java.awt.Color;
import java.awt.Dimension;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.SwingUtilities;
import javax.swing.WindowConstants;

;

public class ScrollDemo1 extends JFrame {

public ScrollDemo1() {
JLabel label = new JLabel();
label.setBounds(50, 0, 1000, 100);
label.setText("Do you want to have a coffee together?");

JButton button = new JButton("Of course!");
button.setBounds(10, 60, 150, 50);
button.addActionListener(e -> label.setText("Well, let's go!"));
JButton button2 = new JButton("No,sorry.");
button2.setBounds(170, 60, 150, 50);
button2.addActionListener(e -> label.setText("Well, let's go!"));

JPanel panel = new JPanel();
panel.setBounds(10, 10, 10, 10);
panel.add(button2);
panel.add(button);
panel.add(label);
// This causes problems:
// panel.setLayout(null);

JScrollPane scrollPane = new JScrollPane(panel);
scrollPane.setViewportBorder(BorderFactory.createLineBorder(Color.red));
scrollPane.setPreferredSize(new Dimension(20, 20));
add(scrollPane);
// This is redundent:
// scrollPane.setViewportView(panel);
setBounds(10, 10, 40, 60);
setTitle("Dating Robot");
// Some initial size (or "pack") is needed to make it big enough to see
setSize(500, 500);
// This makes the app exit cleanly when closing the frame
this.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
}

public static void main(String[] args) {
// TODO Auto-generated method stub
SwingUtilities.invokeLater(() -> {
ScrollDemo1 obj = new ScrollDemo1();
obj.setVisible(true);
});
}
}

关于java - 为什么一旦我改变窗口大小,Swing 应用程序的视口(viewport)大小也会发生变化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56863624/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com