java - 组布局 : JScrollPane in TextArea is not working

标签 java swing jscrollpane jtextarea layout-manager

我是java新手,最近开始开发一个简单的应用程序。目前我对 JScrollPanne 有一个问题,当文本区域中的文本超过区域大小时,它无法向下(或向上)滚动。我查看了一些解决方案,但所有解决方案都适用于 FlowLayot(GridLayout 和 BoxLayout),但不适用于 GroupLayout。这是代码:

JPanel conent_p = new JPanel();
    conent_p.setBorder(new TitledBorder(null, "", TitledBorder.LEADING, TitledBorder.TOP, null, null));

    JLabel lblItemName = new JLabel("Item name:");
    itemField = new JTextField();
    itemField.setColumns(10);

    JLabel lblMxPrice = new JLabel("Max price:");   
    mpriceField = new JTextField();
    mpriceField.setColumns(10);

    JLabel lblQuantity = new JLabel("Quantity:");
    quanField = new JTextField();
    quanField.setColumns(10);

    JLabel lblDelivery = new JLabel("Delivery:");
    delivField = new JTextField();
    delivField.setColumns(10);

    JLabel lblLogcat = new JLabel("LogCat:");
    final JTextArea txtConsole = new JTextArea();
    txtConsole.setEditable(false);
    txtConsole.setLineWrap(true);
    txtConsole.setWrapStyleWord(true);

    sbrText = new JScrollPane(txtConsole);
    sbrText.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);

    // Now create a new TextAreaOutputStream to write to our JTextArea control and wrap a
    // PrintStream around it to support the println/printf methods.
    PrintStream out = new PrintStream(new TextAreaOutputStream(txtConsole));
    // redirect standard output stream to the TextAreaOutputStream
    System.setOut(out);
    // redirect standard error stream to the TextAreaOutputStream
    System.setErr(out);

    GroupLayout gl_conent_p = new GroupLayout(conent_p);
    gl_conent_p.setHorizontalGroup(
        gl_conent_p.createParallelGroup(Alignment.LEADING)
            .addGroup(gl_conent_p.createSequentialGroup()
                .addContainerGap()
                .addGroup(gl_conent_p.createParallelGroup(Alignment.LEADING)
                    .addComponent(lblMxPrice, Alignment.TRAILING)
                    .addComponent(lblItemName, Alignment.TRAILING)
                    .addComponent(lblLogcat, Alignment.TRAILING))
                .addGap(18)
                .addGroup(gl_conent_p.createParallelGroup(Alignment.LEADING)
                    .addGroup(gl_conent_p.createSequentialGroup()
                        .addGroup(gl_conent_p.createParallelGroup(Alignment.LEADING, false)
                            .addComponent(itemField, GroupLayout.PREFERRED_SIZE, 365, GroupLayout.PREFERRED_SIZE)
                            .addGroup(gl_conent_p.createSequentialGroup()
                                .addComponent(mpriceField, GroupLayout.PREFERRED_SIZE, 80, GroupLayout.PREFERRED_SIZE)
                                .addGap(18)
                                .addComponent(lblQuantity)
                                .addPreferredGap(ComponentPlacement.RELATED)
                                .addComponent(quanField, 0, 0, Short.MAX_VALUE)
                                .addGap(18)
                                .addComponent(lblDelivery)
                                .addPreferredGap(ComponentPlacement.RELATED)
                                .addComponent(delivField, GroupLayout.PREFERRED_SIZE, 80, GroupLayout.PREFERRED_SIZE)
                                .addPreferredGap(ComponentPlacement.RELATED)))
                        .addGap(100))
                    .addGroup(gl_conent_p.createSequentialGroup()
                        .addComponent(txtConsole, GroupLayout.PREFERRED_SIZE, 345, GroupLayout.PREFERRED_SIZE)
                        .addComponent(sbrText)
                        .addContainerGap())))
    );
    gl_conent_p.setVerticalGroup(
        gl_conent_p.createParallelGroup(Alignment.LEADING)
            .addGroup(gl_conent_p.createSequentialGroup()
                .addContainerGap()
                .addGroup(gl_conent_p.createParallelGroup(Alignment.BASELINE)
                    .addComponent(lblItemName)
                    .addComponent(itemField, GroupLayout.PREFERRED_SIZE, 20, GroupLayout.PREFERRED_SIZE))
                .addGap(20)
                .addGroup(gl_conent_p.createParallelGroup(Alignment.LEADING)
                    .addGroup(gl_conent_p.createParallelGroup(Alignment.BASELINE)
                        .addComponent(lblDelivery)
                        .addComponent(delivField, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE))
                    .addGroup(gl_conent_p.createParallelGroup(Alignment.BASELINE)
                        .addComponent(lblMxPrice)
                        .addComponent(mpriceField, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
                        .addComponent(lblQuantity)
                        .addComponent(quanField, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)))
                .addGap(55)
                .addGroup(gl_conent_p.createParallelGroup(Alignment.BASELINE)
                    .addComponent(lblLogcat)
                    .addComponent(txtConsole, GroupLayout.PREFERRED_SIZE, 200, GroupLayout.PREFERRED_SIZE)
                    .addComponent(sbrText))
                .addContainerGap())
    );
    conent_p.setLayout(gl_conent_p);

    getContentPane().add(conent_p, BorderLayout.NORTH);

    JButton btnBuy = new JButton("Buy");
    btnBuy.addActionListener( new ActionListener() {
        public void actionPerformed(ActionEvent ev) {
            try {
                String title = itemField.getText().trim();
                String mprice = mpriceField.getText().trim();
                String quantity = quanField.getText().trim();
                String deliver = delivField.getText().trim();

                Item_CONCEPT item = new Item_CONCEPT();

                item.setName(title);
                item.setDelivery(Integer.parseInt(deliver));
                item.setStartPrice(0);
                item.setMaxPrice(Integer.parseInt(mprice));

                myAgent.existsSeller(item);

                Date date = new Date();
                DateFormat df = new SimpleDateFormat("dd.MM.yy HH:mm");
                System.out.println(df.format(date)+": Buyer orders an item: "+item.getName());

                //Clearing all fields
                itemField.setText("");
                quanField.setText("");
                delivField.setText("");
                //txtConsole.setText("");
                mpriceField.setText("");
            }
            catch (Exception e) {
                JOptionPane.showMessageDialog(BuyerGUI.this, "A field is filled incorrectly. "+e.getMessage()+" is invalid.", "Error", JOptionPane.ERROR_MESSAGE); 
            }
        }
    } );![enter image description here][1]

最佳答案

您观察到的问题来自两个事实:

  • 您正在将内容面板添加到 BorderLayout.NORTH
  • 您将文本控制台和滚动 Pane 添加为单独的组件

对于第一个:替换

getContentPane().add(conent_p, BorderLayout.NORTH);

getContentPane().add(conent_p, BorderLayout.CENTER);

第二个:不要单独添加txtConsole,即

水平组内替代

.addGroup(gl_conent_p.createSequentialGroup()
  .addComponent(txtConsole, GroupLayout.PREFERRED_SIZE, 345, GroupLayout.PREFERRED_SIZE)
  .addComponent(sbrText).addContainerGap());

.addComponent(sbrText);

以及垂直组内部

.addGroup(gl_conent_p.createParallelGroup(Alignment.BASELINE)
  .addComponent(lblLogcat)
  .addComponent(txtConsole, GroupLayout.PREFERRED_SIZE, 200, GroupLayout.PREFERRED_SIZE)
  .addComponent(sbrText)).addContainerGap()));

.addGroup(gl_conent_p.createParallelGroup(Alignment.BASELINE)
  .addComponent(lblLogcat)
  .addComponent(sbrText)).addContainerGap()));

关于java - 组布局 : JScrollPane in TextArea is not working,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11284587/

相关文章:

java - 表中的文件名列表

java - Swing - drawString 移动动画失败

java - <br>?\n? java中的换行符

java - 如何将 JScrollPane 与 JTabbedPane 一起使用?

java - for循环不起作用: “not a statement”

java - JProfiler 可以测量堆栈深度吗?

java - 线程一个接一个地运行,但不同时运行,我该如何解决这个问题?

java - 从 fragment 获取 Activity 中的 View

java - 如何使用 JScrollPane 连续滚动

java - 单击提交按钮时 JScrollPane 在顶部页面滚动