我正在尝试使用滚动条创建一个简单的JList,因此我需要在JScrollPane中使用JList。到现在为止还挺好。但是,出于某种原因,我无法调整JScrollPane的大小/位置!?听起来逻辑上它内部的所有内容都应该延伸到100%,所以如果我将JScrollPane设置为300px宽,那么里面的元素也是如此。这是对的吗?
当你在这里时,请批评并给我提示我是否应该改变或优化它。
无论如何,这是代码:
package train;
import java.awt.*;
import javax.swing.*;
public class GUI {
private DefaultListModel loggerContent = new DefaultListModel();
private JList logger = new JList(loggerContent);
GUI() {
JFrame mainFrame = new JFrame("title");
this.addToLog("testing testing");
this.addToLog("another test");
// Create all elements
logger = new JList(loggerContent);
JScrollPane logWrapper = new JScrollPane(logger);
logWrapper.setBounds(10, 10, 20, 50);
// Add all elements
mainFrame.add(logWrapper);
// Show everything
mainFrame.setSize(new Dimension(600, 500));
mainFrame.setVisible(true);
}
public void addToLog(String inputString) {
int size = logger.getModel().getSize();
loggerContent.add(size, inputString);
}
}
提前致谢, QWERTY
编辑:以下是正在运行的屏幕截图:http://i.stack.imgur.com/sLGgQ.png
答案 0 :(得分:2)
JList
的setVisibleRowCount()
方法特别方便,如相关tutorial中所述。 ListDemo
就是一个很好的例子。
附录:
请批评并给我提示......
好吧,既然你问:不要在构造函数中调用公共方法;将它们设为私有或在构造函数完成后调用它们。当add()
可用时,无需查找addElement()
的最后一个索引。另外,请务必在event dispatch thread 上构建GUI。
import java.awt.*;
import javax.swing.*;
/** @see http://stackoverflow.com/questions/5422160 */
public class ListPanel extends JPanel {
private DefaultListModel model = new DefaultListModel();
private JList list = new JList(model);
ListPanel() {
list.setVisibleRowCount(5);
}
public void append(String inputString) {
model.addElement(inputString);
}
private void init() {
for (int i = 0; i < 10; i++) {
this.append("String " + String.valueOf(i));
}
JFrame mainFrame = new JFrame("GUI");
mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JScrollPane jsp = new JScrollPane(list);
mainFrame.add(jsp);
mainFrame.pack();
mainFrame.setVisible(true);
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
new ListPanel().init();
}
});
}
}
答案 1 :(得分:1)
尝试将JScrollPane放入JPanel并将面板添加到框架中。
JPanel panel = new JPanel();
panel.add (logWrapper);
mainFrame.add(panel);
然后设置面板的边界而不是JScrollpane
panel.setBounds(10, 10, 20, 50);
问题是Swing使用布局管理器来控制子边界属性。直接将JScrollpane添加到主框架中,不允许您正确选择正确的边界。
答案 2 :(得分:1)
界限&amp;组件的大小通常会被忽略,而不是它的首选大小和容器使用的布局约束。
要解决此问题,请了解如何使用布局&amp;适当地应用它们。