| /* |
| * Copyright (c) 1997, 2011, 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 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)); |
| } |
| } |