| /* | |
| * Copyright (c) 1997, 2022, Oracle and/or its affiliates. All rights reserved. | |
| * | |
| * Redistribution and use in source and binary forms, with or without | |
| * modification, are permitted provided that the following conditions | |
| * are met: | |
| * | |
| * - Redistributions of source code must retain the above copyright | |
| * notice, this list of conditions and the following disclaimer. | |
| * | |
| * - Redistributions in binary form must reproduce the above copyright | |
| * notice, this list of conditions and the following disclaimer in the | |
| * documentation and/or other materials provided with the distribution. | |
| * | |
| * - Neither the name of Oracle nor the names of its | |
| * contributors may be used to endorse or promote products derived | |
| * from this software without specific prior written permission. | |
| * | |
| * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS | |
| * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, | |
| * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR | |
| * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR | |
| * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, | |
| * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, | |
| * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR | |
| * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF | |
| * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING | |
| * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | |
| * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |
| */ | |
| /* | |
| * This source code is provided to illustrate the usage of a given feature | |
| * or technique and has been deliberately simplified. Additional steps | |
| * required for a production-quality application, such as security checks, | |
| * input validation and proper error handling, might not be present in | |
| * this sample code. | |
| */ | |
| /** | |
| * A UI around the JDBCAdaptor, allowing database data to be interactively | |
| * fetched, sorted and displayed using Swing. | |
| * | |
| * NOTE: This example uses a modal dialog via the static convenience methods in | |
| * the JOptionPane. Use of modal dialogs requires JDK 1.1.4 or greater. | |
| * | |
| * @author Philip Milne | |
| */ | |
| import java.awt.Color; | |
| import java.awt.Component; | |
| import java.awt.Container; | |
| import java.awt.Dimension; | |
| import java.awt.GridLayout; | |
| import java.awt.LayoutManager; | |
| import java.awt.Rectangle; | |
| import java.awt.event.ActionEvent; | |
| import java.awt.event.ActionListener; | |
| import java.awt.event.WindowAdapter; | |
| import java.awt.event.WindowEvent; | |
| import java.util.logging.Level; | |
| import java.util.logging.Logger; | |
| import javax.swing.BoxLayout; | |
| import javax.swing.JButton; | |
| import javax.swing.JComponent; | |
| import javax.swing.JFrame; | |
| import javax.swing.JLabel; | |
| import javax.swing.JOptionPane; | |
| import javax.swing.JPanel; | |
| import javax.swing.JScrollPane; | |
| import javax.swing.JTable; | |
| import javax.swing.JTextArea; | |
| import javax.swing.JTextField; | |
| import javax.swing.UIManager; | |
| import javax.swing.UIManager.LookAndFeelInfo; | |
| import javax.swing.border.BevelBorder; | |
| public final class TableExample implements LayoutManager { | |
| static String[] ConnectOptionNames = { "Connect" }; | |
| static String ConnectTitle = "Connection Information"; | |
| Dimension origin = new Dimension(0, 0); | |
| JButton fetchButton; | |
| JButton showConnectionInfoButton; | |
| JPanel connectionPanel; | |
| JFrame frame; // The query/results window. | |
| JLabel userNameLabel; | |
| JTextField userNameField; | |
| JLabel passwordLabel; | |
| JTextField passwordField; | |
| // JLabel queryLabel; | |
| JTextArea queryTextArea; | |
| JComponent queryAggregate; | |
| JLabel serverLabel; | |
| JTextField serverField; | |
| JLabel driverLabel; | |
| JTextField driverField; | |
| JPanel mainPanel; | |
| TableSorter sorter; | |
| JDBCAdapter dataBase; | |
| JScrollPane tableAggregate; | |
| /** | |
| * Brigs up a JDialog using JOptionPane containing the connectionPanel. | |
| * If the user clicks on the 'Connect' button the connection is reset. | |
| */ | |
| void activateConnectionDialog() { | |
| if (JOptionPane.showOptionDialog(tableAggregate, connectionPanel, | |
| ConnectTitle, | |
| JOptionPane.DEFAULT_OPTION, JOptionPane.INFORMATION_MESSAGE, | |
| null, ConnectOptionNames, ConnectOptionNames[0]) == 0) { | |
| connect(); | |
| frame.setVisible(true); | |
| } else if (!frame.isVisible()) { | |
| System.exit(0); | |
| } | |
| } | |
| /** | |
| * Creates the connectionPanel, which will contain all the fields for | |
| * the connection information. | |
| */ | |
| public void createConnectionDialog() { | |
| // Create the labels and text fields. | |
| userNameLabel = new JLabel("User name: ", JLabel.RIGHT); | |
| userNameField = new JTextField("app"); | |
| passwordLabel = new JLabel("Password: ", JLabel.RIGHT); | |
| passwordField = new JTextField("app"); | |
| serverLabel = new JLabel("Database URL: ", JLabel.RIGHT); | |
| serverField = new JTextField("jdbc:derby://localhost:1527/sample"); | |
| driverLabel = new JLabel("Driver: ", JLabel.RIGHT); | |
| driverField = new JTextField("org.apache.derby.jdbc.ClientDriver"); | |
| connectionPanel = new JPanel(false); | |
| connectionPanel.setLayout(new BoxLayout(connectionPanel, | |
| BoxLayout.X_AXIS)); | |
| JPanel namePanel = new JPanel(false); | |
| namePanel.setLayout(new GridLayout(0, 1)); | |
| namePanel.add(userNameLabel); | |
| namePanel.add(passwordLabel); | |
| namePanel.add(serverLabel); | |
| namePanel.add(driverLabel); | |
| JPanel fieldPanel = new JPanel(false); | |
| fieldPanel.setLayout(new GridLayout(0, 1)); | |
| fieldPanel.add(userNameField); | |
| fieldPanel.add(passwordField); | |
| fieldPanel.add(serverField); | |
| fieldPanel.add(driverField); | |
| connectionPanel.add(namePanel); | |
| connectionPanel.add(fieldPanel); | |
| } | |
| public TableExample() { | |
| mainPanel = new JPanel(); | |
| // Create the panel for the connection information | |
| createConnectionDialog(); | |
| // Create the buttons. | |
| showConnectionInfoButton = new JButton("Configuration"); | |
| showConnectionInfoButton.addActionListener(new ActionListener() { | |
| public void actionPerformed(ActionEvent e) { | |
| activateConnectionDialog(); | |
| } | |
| }); | |
| fetchButton = new JButton("Fetch"); | |
| fetchButton.addActionListener(new ActionListener() { | |
| public void actionPerformed(ActionEvent e) { | |
| fetch(); | |
| } | |
| }); | |
| // Create the query text area and label. | |
| queryTextArea = new JTextArea("SELECT * FROM APP.CUSTOMER", 25, 25); | |
| queryAggregate = new JScrollPane(queryTextArea); | |
| queryAggregate.setBorder(new BevelBorder(BevelBorder.LOWERED)); | |
| // Create the table. | |
| tableAggregate = createTable(); | |
| tableAggregate.setBorder(new BevelBorder(BevelBorder.LOWERED)); | |
| // Add all the components to the main panel. | |
| mainPanel.add(fetchButton); | |
| mainPanel.add(showConnectionInfoButton); | |
| mainPanel.add(queryAggregate); | |
| mainPanel.add(tableAggregate); | |
| mainPanel.setLayout(this); | |
| // Create a Frame and put the main panel in it. | |
| frame = new JFrame("TableExample"); | |
| frame.addWindowListener(new WindowAdapter() { | |
| @Override | |
| public void windowClosing(WindowEvent e) { | |
| System.exit(0); | |
| } | |
| }); | |
| frame.setBackground(Color.lightGray); | |
| frame.getContentPane().add(mainPanel); | |
| frame.pack(); | |
| frame.setVisible(false); | |
| frame.setBounds(200, 200, 640, 480); | |
| activateConnectionDialog(); | |
| } | |
| public void connect() { | |
| dataBase = new JDBCAdapter( | |
| serverField.getText(), | |
| driverField.getText(), | |
| userNameField.getText(), | |
| passwordField.getText()); | |
| sorter.setModel(dataBase); | |
| } | |
| public void fetch() { | |
| dataBase.executeQuery(queryTextArea.getText()); | |
| } | |
| public JScrollPane createTable() { | |
| sorter = new TableSorter(); | |
| //connect(); | |
| //fetch(); | |
| // Create the table | |
| JTable table = new JTable(sorter); | |
| // Use a scrollbar, in case there are many columns. | |
| table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); | |
| // Install a mouse listener in the TableHeader as the sorter UI. | |
| sorter.addMouseListenerToHeaderInTable(table); | |
| JScrollPane scrollpane = new JScrollPane(table); | |
| return scrollpane; | |
| } | |
| public static void main(String[] s) { | |
| // Trying to set Nimbus look and feel | |
| try { | |
| for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) { | |
| if ("Nimbus".equals(info.getName())) { | |
| UIManager.setLookAndFeel(info.getClassName()); | |
| break; | |
| } | |
| } | |
| } catch (Exception ex) { | |
| Logger.getLogger(TableExample.class.getName()).log(Level.SEVERE, | |
| "Failed to apply Nimbus look and feel", ex); | |
| } | |
| new TableExample(); | |
| } | |
| public Dimension preferredLayoutSize(Container c) { | |
| return origin; | |
| } | |
| public Dimension minimumLayoutSize(Container c) { | |
| return origin; | |
| } | |
| public void addLayoutComponent(String s, Component c) { | |
| } | |
| public void removeLayoutComponent(Component c) { | |
| } | |
| public void layoutContainer(Container c) { | |
| Rectangle b = c.getBounds(); | |
| int topHeight = 90; | |
| int inset = 4; | |
| showConnectionInfoButton.setBounds(b.width - 2 * inset - 120, inset, 120, | |
| 25); | |
| fetchButton.setBounds(b.width - 2 * inset - 120, 60, 120, 25); | |
| // queryLabel.setBounds(10, 10, 100, 25); | |
| queryAggregate.setBounds(inset, inset, b.width - 2 * inset - 150, 80); | |
| tableAggregate.setBounds(new Rectangle(inset, | |
| inset + topHeight, | |
| b.width - 2 * inset, | |
| b.height - 2 * inset - topHeight)); | |
| } | |
| } |