2016-04-09 12 views
0

Ich verwende Spilled Panels, die eine Liste von Bildern hat, die auf der linken Seite angeklickt werden können und dann auf der rechten Seite gezeigt werden, habe ich etwas große Bilder. Ich möchte die Bilder mit der Fenstergröße skalierbar machen. Wenn ich also meine Maus in die Nähe der EXIT-Taste ziehe und das Fenster größer mache, wird das Bild größer und umgekehrt für kleinere. Im Moment ist mein JFrame FIXED Standard-Fenstergröße, aber selbst dann sind die Bilder zu groß, um vollständig gesehen zu werden.Wie kann ich meine Bilder in JPanel auf Fenstergröße skalieren?

hier ist mein Code:

Treiberklasse:

import java.awt.*; 
import javax.swing.*; 
public class PickImage 
{ 
    //----------------------------------------------------------------- 
    // Creates and displays a frame containing a split pane. The 
    // user selects an image name from the list to be displayed. 
    //----------------------------------------------------------------- 
    public static void main(String[] args) 
    { 
     JFrame frame = new JFrame("Pick Image"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.pack(); 
     frame.setSize(500, 300); 

     JLabel imageLabel = new JLabel(); 
     JPanel imagePanel = new JPanel(); 
     imagePanel.add(imageLabel); 
     imagePanel.setBackground(Color.white); 

     ListPanel imageList = new ListPanel(imageLabel); 

     JSplitPane sp = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, 
            imageList, imagePanel); 

     sp.setOneTouchExpandable(true); 

     frame.getContentPane().add(sp); 

     frame.setVisible(true); 
    } 
} 

ListPanel Klasse:

import java.awt.*; 
import javax.swing.*; 
import javax.swing.event.*; 

public class ListPanel extends JPanel 
{ 

    private JLabel label; 
    private JList list; 
    public ListPanel(JLabel imageLabel) 
    { 
     label = imageLabel; 

     String[] fileNames = { "Denali2.jpg", 
          "denali.jpg", 
          "MauiLaPerouseBay.jpg", 
           }; 
     list = new JList(fileNames); 
     list.addListSelectionListener(new ListListener()); 
     list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 
     add(list); 
     setBackground(Color.white); 
} 
    private class ListListener implements ListSelectionListener 
    { 
     public void valueChanged(ListSelectionEvent event) 
     { 
     if (list.isSelectionEmpty()) 
      label.setIcon(null); 
     else 
     { 
      String fileName = (String)list.getSelectedValue(); 
      ImageIcon image = new ImageIcon(fileName); 
      label.setIcon(image); 
     } 
     } 
    } 
} 
+0

Mögliche Duplikat [Skalieren des ImageIcon automatisch Etikettengröße] (http://stackoverflow.com/questions/14548808/scale-the-imageicon-automatically-to-label-size) – Titus

Antwort

0
JPanel imagePanel = new JPanel(); 
    imagePanel.add(imageLabel); 

allererst ein JPanel verwendet ein Flowlayout standardmäßig. So werden die Komponenten in ihrer bevorzugten Größe angezeigt, so dass die Größe der Beschriftung nie geändert wird.

So müssen Sie das Layout ändern, so dass das Etikett zur Verfügung, die Platz können die Größe:

JPanel imagePanel = new JPanel(new BorderLayout()); 

Dann können Sie die Stretch Icon verwenden. Dieses Symbol wird automatisch skaliert, um den verfügbaren Platz in der übergeordneten Komponente zu füllen.

Eine andere Möglichkeit ist, das Bild auf einem Panel selbst zu malen, dann können Sie das Bild skalieren, während Sie es malen. Sie müssen die paintComponent() Methode Ihrer Platte außer Kraft zu setzen:

@Override 
protected void paintComponent(Graphics g) 
{ 
    super.paintComponent(g); 
    Dimension d = getSize(); 
    g.drawImage(image, 0, 0, d.width, d.height, this); 

} 

Lesen Sie den Abschnitt aus den Swing-Tutorial auf Custom Painting für weitere Informationen und Beispiele.

Oder Sie können die Background Panel überprüfen, die eine raffiniertere Umsetzung dieses Ansatzes ist. Es erlaubt Ihnen, das Bild 1) skaliert, 2) gekachelt 3) in seiner ursprünglichen Größe zu malen.

+0

ist die Methode paintcomponent innerhalb der go ListListener-Ereignisklasse oder ist es eine eigene Entität? und der einzige Fehler, den ich bekomme, ist, dass in der paintComponent-Methode Bildsymbol –

+0

@UsmanBashiru nicht finden kann, lesen Sie das Custom Painting-Tutorial und laden Sie den Democode herunter und testen Sie den Democode, damit Sie die Grundlagen verstehen. Dann können Sie es anpassen. Halten Sie einen Link zum Swing-Tutorial für einen Verweis auf Swing-Grundlagen, die Sie selbst erlernen können. Oder Sie können das BackgroundPanel herunterladen und sich den Code dort ansehen, um zu sehen, wie das benutzerdefinierte Zeichnen funktioniert. – camickr

Verwandte Themen