Почему мой левый TextField в FlowLayout не показывает текстовое приглашение, а правый показывает? - PullRequest
0 голосов
/ 09 января 2020

Привет, почему мой левый JTextField не показывает текстовое приглашение, а мой правый показывает? JTextField, о котором я говорю, называется gname. Работающий JTextField называется fid.

Программа должна искать оба значения JTextField в базе данных sql, как только кто-то нажимает JButton Поиск. Я использую Prompt Api, включенный в библиотеку swingx.

База данных

Моя проблема

Редактировать: После дальнейшего тестирования я узнал, когда я нажимаю кнопку поиска, обе подсказки видны. Я не знаю, почему это происходит и как.

Вот мой код:

import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.Frame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.border.LineBorder;

import org.jdesktop.swingx.prompt.PromptSupport;

import com.mysql.jdbc.PreparedStatement;

public class errorbrowser implements ActionListener{

    JFrame frame = new JFrame();
    JPanel contentPanel = new JPanel(new CardLayout());

    private String db_host = "localhost";
    private String db_port = "3306";
    private String db_user = "root";
    private String db_pass = "password";
    private String db_base = "errormanager";

    private static final String DRIVER = "com.mysql.jdbc.Driver";
    private java.sql.Connection connection = null;

    errorbrowser(){



        JPanel searchsite = new JPanel(new BorderLayout(5,6));
        searchsite.setBackground(Color.DARK_GRAY);

        JPanel searchbar = new JPanel(new FlowLayout());
        searchbar.setBackground(Color.DARK_GRAY);
    //  searchbar.setBorder(new LineBorder(Color.WHITE, 3));

        JTextField gname = new JTextField(10);
        JTextField fid = new JTextField(10);

        PromptSupport.setPrompt("Gerätebezeichnung",gname);
        gname.setOpaque(false);
        gname.setBorder(javax.swing.BorderFactory.createEmptyBorder());
        gname.setForeground(Color.WHITE);
        gname.setFont(new Font("Dialog BOLD",Font.BOLD, 17));

        PromptSupport.setPrompt("FehlerID",fid);
        fid.setOpaque(false);
        fid.setBorder(javax.swing.BorderFactory.createEmptyBorder());
        fid.setForeground(Color.WHITE);
        fid.setFont(new Font("Dialog BOLD", Font.BOLD, 17));

        searchbar.add(gname);
        searchbar.add(fid);
        searchsite.add(searchbar, BorderLayout.NORTH);

        JButton search = new JButton("Search");
        search.setPreferredSize(new Dimension(100,60));
        search.setMaximumSize(new Dimension(100,60));
        search.setMaximumSize(new Dimension(100,60));
        searchsite.add(search,BorderLayout.CENTER);


        search.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                String gerätename = gname.getText();
                String fehlerid = fid.getText();
                System.out.println("suche startet");
                try {
                    PreparedStatement st = (PreparedStatement) connection
                            .prepareStatement("Select gerätebezeichnung, fehlerid from rational where gerätebezeichnung=? and fehlerid=?");

                    st.setString(1, gerätename);
                    st.setString(2, fehlerid);

                    ResultSet results = st.executeQuery();
                    if(results.next()) {
                        System.out.println("Fehler gefunden!");
                    }else {
                        System.out.println("Fehler nicht gefunden");
                    }
                }catch(SQLException sqlException) {
                    sqlException.printStackTrace();
                }
            }
            });

        JPanel textbox = new JPanel();

        contentPanel.add(searchsite);

        frame.add(contentPanel);

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(600,400);
        frame.setVisible(true);

    }


    public static void main(String[] args) {

        errorbrowser app = new errorbrowser();
        try {
            //Verbindung herstellen 
            app.createConnection();

        }catch(SQLException e) {
            System.err.println("SQL Fehler - "+ e.getLocalizedMessage());
            e.printStackTrace();
        }catch(ClassNotFoundException e) {
            System.err.println("Der Datenbank treiber wurde nicht gefunden. - " + e.getLocalizedMessage());
            e.printStackTrace();
        }
    }

    public void createConnection() throws SQLException, ClassNotFoundException{
        //Treiber initialisieren
        Class.forName(DRIVER);
        //Url für die Verbindung zu der Datenbank
        String mySqlUrl = "jdbc:mysql://" + db_host + ":" + db_port + "/" + db_base;
        //Verbindung herstellen
        connection = DriverManager.getConnection(mySqlUrl,db_user,db_pass);
    }

    public void showAll(String nameOfTable)throws SQLException{
            String query = "Select * FROM " + nameOfTable;
            java.sql.Statement stmt = connection.createStatement();
            ResultSet rs = stmt.executeQuery(query);
            int columns = rs.getMetaData().getColumnCount();
            System.out.println("Alle Einträge zu den Personen ");
            System.out.println();
            // Ich zeige die Tabellenspaltennamen an
            for(int i = 1;i<=columns;i++) {
                System.out.print(rs.getMetaData().getColumnLabel(i)+"\t\t");
            }
                System.out.println();
                System.out.println();
                //Ich zeige den Inhalt der Tabelle an

            while(rs.next()) {
                for(int j = 1;j<=columns;j++) {
                    System.out.print(rs.getString(j)+"\t\t");
                }
                System.out.println();
            }

            //Ich schließe die Streams wieder und gebe die Tabelle wieder frei
            rs.close();
            stmt.close();
        }
        //Ich schließe die Verbindung zu der Datenbank und gebe de Port am PC frei
    public void closeProgramm() throws SQLException{
            this.connection.close();
        }


    @Override
    public void actionPerformed(ActionEvent arg0) {
        // TODO Auto-generated method stub

    }



}

1 Ответ

0 голосов
/ 09 января 2020

Приглашение работает, но фокус находится слева TextBox, что делает его невидимым.

Во время запуска можно не фокусироваться на TextBox (например, удерживая его на * 1005). *)

После настройки рамки вы можете сохранить фокусировку следующим образом:

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(600,400);
    frame.setVisible(true);
    search.requestFocus();//set your focus on button
}
...