2016-11-28 2 views
1

Hier funktioniert meine Jscrollpane nicht. Ich habe den Scrollpanel hinzugefügt und listet beide auf Hauptjpanel auf. Die Jlist funktioniert, aber es scheint, JScrollpane funktioniert nicht in diesem Code.JScrollPane funktioniert nicht in meinem Code

meine Hauptklasse erweitert Jframe, also von der Hauptklasse ich passiere einfach das Hauptpanel und arbeite am selben Panel. und hier verwende ich absolute Layout.

public class ExternalsLinks extends JPanel { 

     ///Links List 
     private JList mainList; 

     ///List Custom Border 
     Border lineBorder = BorderFactory.createLineBorder(Color.BLACK, 5); 

     ///Main Jpanel 
     private JPanel mainPanel; 

     ///Scroll Pane for Lists 
     private JScrollPane mainListScrollPane; 

     /// Lebels 
     private JLabel lblExternalLinks; 

     ///Buttons 
     private Button btnBackCredits = new Button("Back"); 

     ///Button Properties 
     private final int BUTTON_X = 220; private final int BUTTON_Y = 450; 
     private final int BUTTON_X_LENGTH = 350; private final int BUTTON_Y_LENGTH = 50; 

     ///List Options 
     private String [] listMenu = {"Searching", "Sorting"}; 

     ///Constructors 
     public ExternalsLinks(JPanel mainPanel) { 

      this.mainPanel = mainPanel; 
      this.mainPanel.setLayout(null); 

      mainPanel.setBackground(Color.WHITE); 

      initialize_All(); 
     } 

     /// Initialize method to initialize all components to JFrame 
     private void initialize_All() { 

      ///Main Panel Components 

      lblExternalLinks = new JLabel("\"External Links\""); 
      lblExternalLinks.setBounds(290, 0, 400, 100); 
      lblExternalLinks.setFont(new Font("courier", Font.BOLD, 30)); 
      mainPanel.add(lblExternalLinks); 

      mainList = new JList(listMenu); 
      mainList.setBackground(Color.CYAN); 
      mainList.setForeground(Color.BLACK); 
      mainList.setFont(new Font("Calibiri", Font.BOLD, 25)); 

      mainList.setVisibleRowCount(2); 
      mainList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 

      mainList.setBorder(lineBorder); 
      mainList.setBounds(50, 80, 300, 350); 

      mainListScrollPane = new JScrollPane(); 
      mainPanel.add(mainListScrollPane); 
      mainPanel.add(mainList); 





      ///Buttons 
      btnBackCredits.setBounds(BUTTON_X, BUTTON_Y, BUTTON_X_LENGTH, BUTTON_Y_LENGTH); 
      mainPanel.add(btnBackCredits); 

      btnBackCredits.addActionListener(new ActionListener() { 

       @Override 
       public void actionPerformed(ActionEvent arg0) { 
        mainList.setVisible(false); 

        mainPanel.removeAll(); 
        new MainMenu(mainPanel); 
       } 
      }); 
     } 
    } 

Antwort

1

Ich habe die scrollpane hinzugefügt und in der Liste sowohl auf Haupt JPanel.

Das ist ein Problem - tun Sie das nicht. Sie können einem Container nur eine Komponente hinzufügen, und JScrollPane zählt als Container. Fügen Sie also Ihre JList zum Ansichtsfenster von JScrollPane hinzu und fügen Sie dann nur JScrollPane zur GUI hinzu.

Ich verwende absolutes Layout

Und das ist ein anderes ernstes Problem. Verwenden Sie keine Null-Layouts und setBounds(...). Wenn Sie beispielsweise setBounds auf Ihrer Liste aufrufen, wird verhindert, dass die Bildlaufleiste funktioniert, da die Liste innerhalb der JScrollPane nicht so wie gewünscht erweitert werden kann. Lernen und verwenden Sie die Layout-Manager.

Außerdem fügen Sie die JList nie dem Ansichtsfenster von JScrollPane hinzu!

Sie benötigen JScrollPane scrollPane = new JScrollPane(myList); oder etwas ähnliches, mit was auch immer Ihre variablen Namen sind. Bitte gehen Sie durch die Tutorials, da dies dort vollständig erklärt wird.

Zum Beispiel:

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Font; 
import javax.swing.*; 

@SuppressWarnings("serial") 
public class ExternalsLinks2 extends JPanel { 

    // constants 
    private static final String[] LIST_DATA = {"Searching", "Sorting"}; 
    private static final Font LIST_FONT = new Font("Calibiri", Font.BOLD, 25); 
    private static final Font LABEL_FONT = new Font("courier", Font.BOLD, 30); 
    private static final int LIST_VISIBLE_ROW_COUNT = 10; 
    private static final String TITLE_TEXT = "External Links"; 
    private static final Color LIST_BG = Color.CYAN; 

    // JList field created with constant array data 
    private JList<String> jList = new JList<>(LIST_DATA); 

    public ExternalsLinks2() { 
     jList.setFont(LIST_FONT); 
     jList.setPrototypeCellValue("ABCDEFGHIJKLMNOP ABCDE"); 
     jList.setVisibleRowCount(LIST_VISIBLE_ROW_COUNT); 
     jList.setBackground(LIST_BG); 

     JLabel titleLabel = new JLabel(TITLE_TEXT, SwingConstants.CENTER); 
     titleLabel.setFont(LABEL_FONT); 

     JButton backButton = new JButton("Back"); 
     // add ActionListener or AbstractAction here 

     setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); 
     setLayout(new BorderLayout(5, 5)); // use BorderLayout 
     add(titleLabel, BorderLayout.PAGE_START); // JLabel at top 
     add(new JScrollPane(jList), BorderLayout.CENTER); // JList inside of JScrollPane in center 
     add(backButton, BorderLayout.PAGE_END); // JButton at bottom 
    } 

    private static void createAndShowGui() { 
     JFrame frame = new JFrame("External Links"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().add(new ExternalsLinks2()); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(() -> createAndShowGui()); 
    } 
} 

, die als angezeigt:

enter image description here

+0

Welche LAYO ut wird einfach und gut zu bedienen sein? Ich muss auch die Listenpositionen auf einer bestimmten Position festlegen. –

+0

@ MD.NASHIDKAMAL: Normalerweise verschachteln Sie JPanels jeweils mit einem eigenen Layout, wenn Sie eine komplexe GUI haben. Am einfachsten und am wenigsten leistungsfähig ist das FlowLayout. Ich empfehle auch, BorderLayout und GridLayout zu lernen. Nachdem Sie sich mit diesen vertraut gemacht haben, checken Sie BoxLayout und zuletzt GridBagLayout aus. –

+0

Flow-Layout ordnen Sie die Komponenten einfach automatisch an: D ich bin damit gelangweilt. Ich kenne Border Layout, ich werde es verwenden. Danke :) –

Verwandte Themen