在 Swing 中更改 JScrollPane 高度

Changing JScrollPane height in Swing

我未能更改 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>");
   }
}

GUI 需要如下所示

I want to remove the large vertical gaps between the componets, and the jLabel should use that space

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

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

然后您想要 grow/shrink 调整框架大小的组件应添加到框架的 CENTER

然后您创建第二个面板来包含您的其他组件。然后根据您的确切要求,将此面板添加到框架的 PAGE_STARTPAGE_NORTH

此面板的布局管理器可以随心所欲。可能是 GridLayout、GridBagLayout 或垂直 BoxLayout。

阅读 Swing 教程中有关布局管理器的部分,了解更多信息和工作示例。关键是您创建嵌套面板,每个嵌套面板都使用不同的布局管理器来实现您的布局。