2016-04-11 10 views
2

Ich konnte die Höhe von JPanel oder JScrollPane nicht ändern, damit mehr Zeilen angezeigt werden, ich habe GridLayout verwendet. Es scheint, dass jede Komponente darin dieselbe Größe haben sollte, selbst wenn ich setSize() verwende. Soll ich ein anderes Layout verwenden?Ändern der JScrollPane-Höhe in Swing

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>"); 
    } 
} 

Run application

Die GUI müssen wie diese

enter image description here

+2

* "Soll ich ein anderes Layout verwenden?" * Wahrscheinlich oder eine Kombination von Layouts. Bereitstellung von ASCII-Grafiken oder einer einfachen Zeichnung des * vorgesehenen * Layouts der GUI bei minimaler Größe und wenn sie in der Größe veränderbar ist, mit mehr Breite und Höhe. –

+1

'public void paint (Grafik g) { try { BufferedImage image = ImageIO.read (neue Datei (" file.jpg ")); g.drawImage (image, 170, 0, null); 'Sogar mit diesen 4 Codezeilen ist viel los. –

+0

Ich möchte die großen vertikalen Lücken zwischen den Komponenten entfernen, und das jLabel sollte diesen Platz verwenden . – Ahmed

Antwort

3

ich die großen vertikalen Lücken zwischen den componets entfernen aussehen soll, und die JLabel sollte diesen Raum nutzen

In deinem Kommentar sagst du, du möchtest, dass das Label den Platz nutzt. Aber in Ihrem Bild zeigen Sie den Textbereich mit dem ganzen Raum. Wie können wir eine Frage beantworten, wenn Sie uns widersprüchliche Anforderungen geben? Seien Sie spezifisch und genau, wenn Sie ein Problem beschreiben.

In jedem Fall ist das Standardlayout von JFrame ein BorderLayout, also würden Sie wahrscheinlich damit beginnen.

Dann sollte die Komponente, die Sie vergrößern/verkleinern möchten, wenn der Rahmen in der Größe geändert wird, zum CENTER des Rahmens hinzugefügt werden.

Dann erstellen Sie ein zweites Panel, um Ihre anderen Komponenten zu enthalten. Diese Platte würde dann entweder zu der PAGE_START oder PAGE_NORTH des Rahmens je nach Ihren genauen Anforderungen hinzugefügt werden.

Der Layout-Manager dieses Panels kann dann beliebig sein. Vielleicht ein GridLayout oder ein GridBagLayout oder ein vertikales BoxLayout.

Lesen Sie den Abschnitt aus dem Swing-Tutorial zu Layout-Managern für weitere Informationen und Arbeitsbeispiele. Der entscheidende Punkt ist, dass Sie mit einem anderen Layout-Manager jeweils eine Verschachtelung erstellen, um Ihr Layout zu erreichen.

+0

Sorry, wenn das nicht klar war, aber das JLabel in diesem Fall ist der Textbereich, und es ist das einzige verwendete JLabel-Objekt im Code. – Ahmed

+0

@Ahmed, naja wie gesagt "auf jeden Fall" und habe dir dann die Antwort gegeben. Also ist das Problem gelöst? – camickr

+0

ja, danke für die Lösung. – Ahmed