我没有更改JPanelJScrollPane的高度以显示更多行,所以我使用了GridLayout。看来,即使使用setSize(),其中的每个组件也应具有相同的大小。我应该使用其他布局吗?

import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;


public class Main {

   private JFrame mainFrame;
   private JLabel headerLabel;
   private JLabel statusLabel;
   private JPanel controlPanel;
   private imagePanel image;

   JTextField textField = new JTextField(20);

   public Main() throws IOException{
        prepareGUI();
   }


   class imagePanel extends JPanel {
private static final long serialVersionUID = 1L;

public void paint(Graphics g) {
       try {
            BufferedImage image = ImageIO.read(new File("file.jpg"));
            g.drawImage(image, 170, 0, null);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
   }
   }

   public static void main(String[] args) throws IOException{
   Main swingControlDemo = new Main();

  swingControlDemo.showEventDemo();

   }

   private void prepareGUI(){
  mainFrame = new JFrame("Java SWING Examples");
  mainFrame.setSize(400,500);
  GridLayout gridlayout = new GridLayout(4, 1);
  gridlayout.setVgap(1);
  mainFrame.setLayout(gridlayout);

  headerLabel = new JLabel("",JLabel.CENTER );
  statusLabel = new JLabel("",JLabel.CENTER);

  JScrollPane scroller = new JScrollPane(statusLabel, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);

  mainFrame.addWindowListener(new WindowAdapter() {
     public void windowClosing(WindowEvent windowEvent){
        System.exit(0);
         }
      });
  controlPanel = new JPanel();
  controlPanel.setLayout(new FlowLayout());

  image = new imagePanel();
  image.setLayout(new FlowLayout());



 // mainFrame.add(headerLabel);
  mainFrame.add(image);
  mainFrame.add(controlPanel);
  mainFrame.add(scroller);
  mainFrame.setVisible(true);
   }

   private void showEventDemo(){
  headerLabel.setText("Control in action: Button");

  JButton okButton = new JButton("reload");
  JButton submitButton = new JButton("Submit");
  JButton cancelButton = new JButton("Cancel");

  okButton.setActionCommand("reload");
  submitButton.setActionCommand("Submit");
  cancelButton.setActionCommand("Cancel");

  okButton.addActionListener(new ButtonClickListener());
  submitButton.addActionListener(new ButtonClickListener());
  cancelButton.addActionListener(new ButtonClickListener());

  controlPanel.add(okButton);
  controlPanel.add(submitButton);
  //controlPanel.add(cancelButton);
  controlPanel.add(textField);
  System.out.println("---------------------");
  mainFrame.setVisible(true);
   }

   private class ButtonClickListener implements ActionListener{
  public void actionPerformed(ActionEvent e) {
     String command = e.getActionCommand();
     if( command.equals( "reload" ))  {

             statusLabel.setText(convertToMultiline("Line1\nLine2\nLine3\nLine4\nLine5\nLine6\nLine7\nLine8\nLine9\nLine2\nLine3\nLine\nLine2\nLine3\nLine\nLine2\nLine3\nLine\nLine2\nLine3\nLine\nLine2\nLine3\nLine\nLine2\nLine3\nLine\nLine2\nLine3\nLine"));

     }
     else  {
        statusLabel.setText("Submit Button clicked.");
     }
  }
   }

   public static String convertToMultiline(String orig)
   {
       return "<html>" + orig.replaceAll("\n", "<br>");
   }
}


java - 在Swing中更改JScrollPane高度-LMLPHP

GUI需要看起来像这样

java - 在Swing中更改JScrollPane高度-LMLPHP

最佳答案

我想消除组件之间的较大垂直间隙,并且jLabel应该使用该空间


好吧,在您的评论中,您说您希望标签使用空格。但是在您的图片中,您将显示带有所有空格的文本区域。当您给我们提出矛盾的要求时,我们如何回答问题?描述问题时要具体而准确。

无论如何,JFrame的默认布局是BorderLayout,因此您可能会以此作为开始。

然后,将您要在调整框架大小时增加/缩小的组件添加到框架的CENTER中。

然后,创建另一个面板以包含其他组件。然后根据您的确切要求,将该面板添加到框架的PAGE_STARTPAGE_NORTH中。

这样,该面板的布局管理器就可以随心所欲。可能是GridLayout,GridBagLayout或垂直BoxLayout。

阅读有关布局管理器的Swing教程中的部分,以获取更多信息和工作示例。关键是要使用不同的布局管理器创建嵌套面板,以实现布局。

07-26 09:12