Java 自定义JComponent以设置首选的可滚动视口大小
因此,我试图创建一个自定义组件,以便设置滚动窗格的大小。以下是带有滚动窗格的部分:Java 自定义JComponent以设置首选的可滚动视口大小,java,swing,jscrollpane,preferredsize,jviewport,Java,Swing,Jscrollpane,Preferredsize,Jviewport,因此,我试图创建一个自定义组件,以便设置滚动窗格的大小。以下是带有滚动窗格的部分: JScrollPane scrollPane = new JScrollPane(leftTop); customScroll t1 = new customScroll(); scrollPane.add(t1); left.add(scrollPane); leftTop是左侧面板内部的嵌套面板。这是我的customScroll类,它是我正在制作的自定义组件,因此我可以设置滚动窗格的大小: public c
JScrollPane scrollPane = new JScrollPane(leftTop);
customScroll t1 = new customScroll();
scrollPane.add(t1);
left.add(scrollPane);
leftTop是左侧面板内部的嵌套面板。这是我的customScroll类,它是我正在制作的自定义组件,因此我可以设置滚动窗格的大小:
public class customScroll extends JComponent implements Scrollable {
public customScroll() {
getPreferredScrollableViewportSize();
}
@Override
public Dimension getPreferredScrollableViewportSize() {
return(new Dimension(266,300));
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
}
@Override
public int getScrollableBlockIncrement(Rectangle visibleRect,
int orientation, int direction) {
return 0;
}
@Override
public boolean getScrollableTracksViewportHeight() {
return false;
}
@Override
public boolean getScrollableTracksViewportWidth() {
return false;
}
@Override
public int getScrollableUnitIncrement(Rectangle visibleRect,
int orientation, int direction) {
return 0;
}
}
如何设置首选的可滚动大小?提供设置程序
public void setPreferredScrollableViewportSize(Dimension size) {
this.preferredScrollableViewportSize = size;
}
现在,显然,您的getPreferredScrollableViewportSize
需要返回此值
public class CustomScroll extends JComponent implements Scrollable {
private Dimension preferredScrollableViewportSize = new Dimension(266, 300);
public CustomScroll() {
}
public void setPreferredScrollableViewportSize(Dimension size) {
this.preferredScrollableViewportSize = size;
}
@Override
public Dimension getPreferredScrollableViewportSize() {
return preferredScrollableViewportSize;
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
}
@Override
public int getScrollableBlockIncrement(Rectangle visibleRect,
int orientation, int direction) {
return 64;
}
@Override
public boolean getScrollableTracksViewportHeight() {
return false;
}
@Override
public boolean getScrollableTracksViewportWidth() {
return false;
}
@Override
public int getScrollableUnitIncrement(Rectangle visibleRect,
int orientation, int direction) {
return 64;
}
}
在包装JScrollPane
之前也应该设置此选项,这样会更容易管理,否则,您需要invalidate
使JScrollPane
所在的容器失效
您可能希望有一个通读版本,这将使人们更容易阅读您的代码,您也更容易阅读其他代码
但这仍然是首选尺寸 不,它不会,它将使用
preferredScrollableViewportSize
(假设您在JScrollPane
我的滚动窗格会根据其中的内容进行调整,因此它只会随着按钮的添加而增长
那你做错了什么
JScrollPane scrollPane = new JScrollPane(leftTop);
customScroll t1 = new customScroll();
// This is wrong...
scrollPane.add(t1);
left.add(scrollPane);
您不应该向JScrollPane
添加任何内容,这与它们的工作方式无关,相反,您需要将组件包装在其中
leftTop t1 = new CustomScroll();
JScrollPane scrollPane = new JScrollPane(leftTop);
left.add(scrollPane);
或者类似的
我希望它保持一个固定的大小,所以我需要显式地设置一个它不能偏离的大小
是的,preferredScrollableViewportSize
就是这么做的
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.Rectangle;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.Scrollable;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class JavaApplication57 {
public static void main(String[] args) {
new JavaApplication57();
}
public JavaApplication57() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
}
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class TestPane extends JPanel {
public TestPane() {
setLayout(new GridBagLayout());
CustomScroll comp = new CustomScroll();
comp.setPreferredScrollableViewportSize(new Dimension(100, 100));
comp.setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridwidth = GridBagConstraints.REMAINDER;
gbc.weightx = 1;
gbc.insets = new Insets(5, 10, 10, 5);
for (int index = 0; index < 100; index++) {
JButton btn = new JButton("Hello world " + index);
comp.add(btn, gbc);
}
add(new JScrollPane(comp));
}
}
public class CustomScroll extends JComponent implements Scrollable {
private Dimension preferredScrollableViewportSize = new Dimension(266, 300);
public CustomScroll() {
}
public void setPreferredScrollableViewportSize(Dimension size) {
this.preferredScrollableViewportSize = size;
}
@Override
public Dimension getPreferredScrollableViewportSize() {
return preferredScrollableViewportSize;
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
}
@Override
public int getScrollableBlockIncrement(Rectangle visibleRect,
int orientation, int direction) {
return 64;
}
@Override
public boolean getScrollableTracksViewportHeight() {
return false;
}
@Override
public boolean getScrollableTracksViewportWidth() {
return false;
}
@Override
public int getScrollableUnitIncrement(Rectangle visibleRect,
int orientation, int direction) {
return 64;
}
}
}
导入java.awt.Dimension;
导入java.awt.EventQueue;
导入java.awt.Graphics;
导入java.awt.GridBagConstraints;
导入java.awt.GridBagLayout;
导入java.awt.Insets;
导入java.awt.Rectangle;
导入javax.swing.JButton;
导入javax.swing.JComponent;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
导入javax.swing.JScrollPane;
导入javax.swing.Scrollable;
导入javax.swing.UIManager;
导入javax.swing.UnsupportedLookAndFeelException;
公共类JavaApplication57{
公共静态void main(字符串[]args){
新JavaApplication57();
}
公共JavaApplication57(){
invokeLater(新的Runnable(){
@凌驾
公开募捐{
试一试{
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
}catch(ClassNotFoundException |实例化Exception | IllegalacessException |不支持ookandfeelException ex){
例如printStackTrace();
}
JFrame=新JFrame(“测试”);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(newtestpane());
frame.pack();
frame.setLocationRelativeTo(空);
frame.setVisible(true);
}
});
}
公共类TestPane扩展了JPanel{
公共测试窗格(){
setLayout(新的GridBagLayout());
CustomScroll comp=新的CustomScroll();
组件设置PreferredScrollableViewPortSize(新维度(100100));
组件设置布局(新GridBagLayout());
GridBagConstraints gbc=新的GridBagConstraints();
gbc.gridwidth=GridBagConstraints.rements;
gbc.weightx=1;
gbc.插图=新插图(5,10,10,5);
对于(int-index=0;index<100;index++){
JButton btn=新JButton(“你好世界”+索引);
公司地址(btn、gbc);
}
添加(新的JScrollPane(comp));
}
}
公共类CustomScroll扩展JComponent实现可滚动{
私有维度preferredScrollableViewportSize=新维度(266300);
公共自定义卷轴(){
}
public void setPreferredScrollableViewportSize(维度大小){
this.preferredScrollableViewportSize=大小;
}
@凌驾
公共维度getPreferredScrollableViewportSize(){
返回preferredScrollableViewportSize;
}
@凌驾
公共组件(图形g){
超级组件(g);
}
@凌驾
public int getScrollableBlockIncrement(矩形visibleRect,
整数方向,整数方向){
返回64;
}
@凌驾
公共布尔值getScrollableTracksViewPerThight(){
返回false;
}
@凌驾
公共布尔值getScrollableTracksViewportWidth(){
返回false;
}
@凌驾
public int getScrollableUnitIncrement(矩形visibleRect,
整数方向,整数方向){
返回64;
}
}
}
请注意Java命名约定——特别是类名;另外,请提及您面临的具体问题。但这仍然只是获得首选大小,我的滚动窗格会根据其中的内容进行调整,以便随着按钮的添加而增长。我希望它保持固定大小,因此需要显式设置一个不能偏离f的大小rom.nvm我是弱智,无法阅读文档页面。尽管lol,你的答案是+1。