所以,我有一个程序搜索文件以找到用户想要的所需信息,我试图在JOptionPane的一个漂亮的表中输出它以使其更容易阅读,但我不断得到这样的东西:
我希望这些行相应排列并正确格式化,这是该特定消息的代码:
String message=String.format("%-10s|%7s|%14s|%13s|%22s", element,symbol,atomicNumber,atomicMass,valence);
JOptionPane.showMessageDialog(null, "Name |Symbol |Atomic Number |Atomic Mass |# of Valence Electrons \n _________________________________________________________________ \n " + message);
似乎无法弄清楚我在这里做错了什么,我在一个不同的任务中使用了完全相同的格式代码,它只使用了终端并且工作正常,但现在我正在尝试使用它在JOptionPane中没有正确格式化。
有关如何解决此问题或使其有效的任何想法?
答案 0 :(得分:4)
尝试使用JTable:
Object[][] rows = {
{element,symbol,atomicNumber,atomicMass,valence}
};
Object[] cols = {
"Name","Symbol","Atomic Number","Atomic Mass", "# of Valence Electrons"
};
JTable table = new JTable(rows, cols);
JOptionPane.showMessageDialog(null, new JScrollPane(table));
答案 1 :(得分:0)
终端和Swing对话框之间的区别在于前者使用固定宽度字体,而后者使用可变宽度字体。例如:如果你看一下你发布的图片,你可以看到'i'远远小于'm'。这意味着15个字符长的字符串不一定占用与另一个相同长度的字符串相同的空间。
在Swing中格式化这种格式的正确解决方案是使用JTable或GridBagLayout。如果您乐意使用第三方库,我建议您查看DesignGridLayout。
您也可以显式设置字体,但这仍然需要您更改代码,在Swing应用程序的上下文中看起来有点过时。
答案 2 :(得分:0)
有关如何解决此问题或使其有效的任何想法?
在JOptionPane的暴力解决方案的上下文中,您应该能够指定选项窗格要使用的对象数组。所以代码就像:
JLabel[] labels = new JLabel[3];
JLabel heading = new JLabel(...);
heading.setFont( ("monospaced", Font.PLAIN, 12) );
labels[0] = heading;
JLabel line = new JLabel(...);
...
JLabel data = new JLabel(...);
...
JOptionPane.showMessageDialog(null, labels);
这不是一个非常好的解决方案,但我只想展示JOptionPane的灵活性,以显示垂直组织的多个组件。
另一种选择可能是使用UIManager并更改选项窗格的默认字体。代码类似于:
Font original = UIManager.getFont("Label.font");
UIManager.put("Label.font", new Font(...)); // specify your monospaced font here
JOptionPane.showMessage(...);
UIManager.put("Label.font", original); // restore default font
我不确定这种字体是否适用于选项面板上的所有组件,或仅适用于按钮或显示组件。
JTable对我的钱来说是更好的方法。