【问题标题】:Automatic Resize of jPanel as text is added添加文本时自动调整 jPanel 的大小
【发布时间】:2014-10-05 21:37:31
【问题描述】:

我有一个带有按钮的文字游戏。单击按钮时,将显示文本。我的文本出现在 jPanel 中,该 jPanel 位于 jScrollPane 中。我希望我的 jPanel 自动为要添加的文本行腾出更多的垂直空间。我一直在手工做,但它更耗时。有没有办法做到这一点,或者可能以某种方式打包一个jPanel。我对此很陌生,所以如果您需要任何额外的信息来帮助我,请随时询问。谢谢。

【问题讨论】:

    标签: java swing resize jpanel jscrollpane


    【解决方案1】:

    我会使用一个可以自动执行此操作的组件——JTextArea。随着更多文本的添加,它将自动放大。

    如果您需要更具体的帮助或代码示例,请发布您自己的小型可编译和可运行的测试示例程序,我可以尝试修改。


    你说:

    我不想使用 JTextArea,因为我不希望用户能够突出显示或删除一开始就存在的任何文本。

    没问题。只需使 JTextArea 不可聚焦且不可编辑。

    我一直在使用等于 "" 的 jLabel,当按下按钮时,该 jLabel 会被赋予一个新值。

    试试这样的:

    import java.awt.event.ActionEvent;
    import java.awt.event.KeyEvent;
    import javax.swing.*;
    
    @SuppressWarnings("serial")
    public class AddNewLines extends JPanel {
       private JTextArea textArea = new JTextArea(10, 15);
       private JButton addLineBtn = new JButton(new AddLineAction("Add Line", KeyEvent.VK_A));
    
       public AddNewLines() {
          textArea.setEditable(false);
          textArea.setFocusable(false);
          textArea.setWrapStyleWord(true);
          textArea.setLineWrap(true);
          textArea.setOpaque(false);
    
          JScrollPane scrollPane = new JScrollPane(textArea);
          scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
    
          add(scrollPane);
          add(addLineBtn);
    
       }
    
       class AddLineAction extends AbstractAction {
          private int count = 0;
          public AddLineAction(String name, int mnemonic) {
             super(name);
             putValue(MNEMONIC_KEY, mnemonic);
          }
    
          @Override
          public void actionPerformed(ActionEvent e) {
             if (count != 0) {
                textArea.append("\n");
             }
             textArea.append("Line of Text: " + count);
             count++;
          }
       }
    
       private static void createAndShowGui() {
          AddNewLines mainPanel = new AddNewLines();
    
          JFrame frame = new JFrame("Add New Lines");
          frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
          frame.getContentPane().add(mainPanel);
          frame.pack();
          frame.setLocationByPlatform(true);
          frame.setVisible(true);
       }
    
       public static void main(String[] args) {
          SwingUtilities.invokeLater(new Runnable() {
             public void run() {
                createAndShowGui();
             }
          });
       }
    }
    

    【讨论】:

    • 我不想使用 JTextArea,因为我不希望用户能够突出显示或删除最初存在的任何文本。我一直在使用等于"" 的 jLabel,当按下按钮时,该 jLabel 会被赋予一个新值。
    • 所以我还没有用 JTextArea 测试过任何东西(尽管我会),但是有没有改变其他功能,比如 JTextArea 的颜色,以及加粗某些文本区域的能力?如果是这样,我可能可以使它与我已经拥有的相同。
    • @MattSpiller 不允许用户选择文本是一个奇怪的要求,恕我直言 - 用不可编辑的文本组件替换我们的任何标签让我们的许多客户非常高兴,因为他们现在可以复制我们程序中的一系列文本,可满足许多不同的需求。不能说我一开始就觉得它很有用,但是用户都快疯了……
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-28
    • 1970-01-01
    • 1970-01-01
    • 2011-02-28
    • 1970-01-01
    • 1970-01-01
    • 2014-09-25
    相关资源
    最近更新 更多