2016-07-27 10 views
0

Alles außer der Schaltfläche wird im Fenster angezeigt. Gibt es etwas, das mir fehlt? Dies ist das erste Mal mit Schaltflächen und bin mir nicht sicher, was schief läuft. Es könnte sich um ein Formatierungsproblem handeln. Kann mir jemand sagen, ob es ein Problem mit setLocation() und setSize() gibt?Schaltfläche nicht in meinem Jframe angezeigt

import java.awt.BorderLayout; 
import java.awt.Button; 
import java.awt.FlowLayout; 
import java.awt.Font; 
import java.awt.TextField; 

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JTextField; 

public class HashString extends JPanel { 


    public static void hashString() { 
    } 

    public void window() { 
    JLabel label1 = new JLabel(
      "Enter Your Strings separated by a comma, below. "); 
    label1.setHorizontalAlignment(JLabel.CENTER); 
    label1.setFont(new Font("Times New Roman", Font.BOLD, 12)); 
    label1.setVerticalAlignment(JLabel.TOP); 

    JTextField field = new JTextField(50); 
    field.setVisible(true); 
    field.setText("Enter Strings Here"); 
    field.setSize(300, 251); 
    field.setHorizontalAlignment(JTextField.CENTER); 
    field.setLocation(135, 60); 

    Button btn = new Button("Enter These Values"); 
    btn.setLocation(240 ,420); 
    btn.setSize(100, 100); 
    btn.setVisible(true); 
    btn.setFont(new Font("Times new roman",Font.BOLD,12)); 

    JFrame frame = new JFrame("Test1"); 
    frame.add(new HashString()); 
    frame.add(btn); 
    frame.setVisible(true); 
    frame.add(field); 
    frame.setLocationRelativeTo(null); 
    frame.add(label1); 
    frame.setSize(600, 450); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

} 

}

+0

Es ist, shoudlve setVisible ganz am Ende hinzugefügt. –

Antwort

2

Ich denke, man sollte sich ändern, wie Sie das Programm strukturiert haben. Anstatt jede Position mit einer manuellen Position innerhalb der JFrame zu setzen, sollten Sie einfach einen Layout-Manager wie BorderLayout verwenden, der hier einfach implementiert werden kann.

Auch sollten Sie immer alles aus der EventQueue und keine anderen Themen adressieren. Außerdem ist es nicht ratsam, AWT-Komponenten wie Button und Swing-Komponenten wie JButton miteinander zu kombinieren. Es ist zwar viel besser als zuvor - wie in Java 1.6 - aber es kann immer noch einige Probleme auftauchen.

import java.awt.BorderLayout; 
import java.awt.EventQueue; 
import java.awt.Font; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JTextField; 
import javax.swing.border.EmptyBorder; 

public class HashString { // It seems that this isn't a JPanel. Rather, it is an application. 

    JFrame frame; 

    public void initialise() { 

     frame = new JFrame("Test 1"); // You can create the frame of the application here and set title 

     frame.setLocation(200, 200); 
     frame.setSize(300, 300); 

     JPanel contentPanel = new JPanel();  // To allow a border to be set, I've declared a content panel inside the 
               // frame. 
     contentPanel.setBorder(new EmptyBorder(5, 5, 5, 5)); // This sets a border to make everything look nice 
     contentPanel.setLayout(new BorderLayout(5, 5)); // This creates the BorderLayout, which manages the layout of 
                 // the components easily 
     frame.setContentPane(contentPanel); 

     JLabel instructionsLabel = new JLabel("Enter Your Strings separated by a comma, below. "); 
     instructionsLabel.setFont(new Font("Times New Roman", Font.BOLD, 12)); 
     contentPanel.add(instructionsLabel, BorderLayout.NORTH); // BorderLayout.NORTH tells the layout manager where 
                    // to put the component. 

     JTextField txtField = new JTextField(); 
     txtField.setText("Enter Strings Here"); 
     contentPanel.add(txtField, BorderLayout.CENTER); 

     JButton btn = new JButton("Enter These Values"); 
     btn.setFont(new Font("Times new roman", Font.BOLD, 12)); 
     btn.addActionListener(new ActionListener() { 
      @Override public void actionPerformed(ActionEvent e) { 
       // Call whatever method that you want to call when this is relevant. Set textField and other variables 
       // here. You can do things like 'txtField.setText(methodOperationOnString (txtField.getText()))' or 
       // something of the like. 
      } 
     }); 
     contentPanel.add(btn, BorderLayout.SOUTH); 

     frame.setVisible(true); 

    } 

    public static void main(String[] args) { 
     // This tells it to create the entire thing on the GUI thread 
     EventQueue.invokeLater(new Runnable() { 
      @Override public void run() { 
       HashString b = new HashString(); 
       b.initialise(); 
      } 
     }); 
    } 
} 
+1

WOW! Das ist sehr hilfreich! Ich bin es gewohnt, alles manuell zu machen –

+0

Wenn Ihre Hauptmethode in einer anderen Klasse ist - ändern Sie 'public void initialise()' in 'public HashString()'. Dann wird es automatisch konstruiert, wenn Sie 'new HashString() 'aufrufen. Sie können auch einfach die 'main' entfernen. – ifly6

+0

Mischen Sie nicht JavaFx und Swing. Dies ist eine Swing-Anwendung. Versuchen Sie nicht, es von hier aus zu initialisieren. Wenn Sie dies getan haben (und Sie sich in Eclipse befinden), müssen Sie die Ausführungskonfiguration entfernen. Klicken Sie auf den Pfeil neben der Schaltfläche "Play"> "Run Configurations> HashString" und klicken Sie in der Konfigurationsdatei auf "Delete". – ifly6