1 /*
   2  * Copyright (c) 1997, 2018, Oracle and/or its affiliates. All rights reserved.
   3  *
   4  * Redistribution and use in source and binary forms, with or without
   5  * modification, are permitted provided that the following conditions
   6  * are met:
   7  *
   8  *   - Redistributions of source code must retain the above copyright
   9  *     notice, this list of conditions and the following disclaimer.
  10  *
  11  *   - Redistributions in binary form must reproduce the above copyright
  12  *     notice, this list of conditions and the following disclaimer in the
  13  *     documentation and/or other materials provided with the distribution.
  14  *
  15  *   - Neither the name of Oracle nor the names of its
  16  *     contributors may be used to endorse or promote products derived
  17  *     from this software without specific prior written permission.
  18  *
  19  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
  20  * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
  21  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
  22  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
  23  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
  24  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
  25  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
  26  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
  27  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
  28  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
  29  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  30  */
  31 
  32 /*
  33  * This source code is provided to illustrate the usage of a given feature
  34  * or technique and has been deliberately simplified. Additional steps
  35  * required for a production-quality application, such as security checks,
  36  * input validation and proper error handling, might not be present in
  37  * this sample code.
  38  */
  39 
  40 
  41 
  42 /**
  43  * A a UI around the JDBCAdaptor, allowing database data to be interactively
  44  * fetched, sorted and displayed using Swing.
  45  *
  46  * NOTE: This example uses a modal dialog via the static convenience methods in
  47  * the JOptionPane. Use of modal dialogs requires JDK 1.1.4 or greater.
  48  *
  49  * @author Philip Milne
  50  */
  51 import java.awt.Color;
  52 import java.awt.Component;
  53 import java.awt.Container;
  54 import java.awt.Dimension;
  55 import java.awt.GridLayout;
  56 import java.awt.LayoutManager;
  57 import java.awt.Rectangle;
  58 import java.awt.event.ActionEvent;
  59 import java.awt.event.ActionListener;
  60 import java.awt.event.WindowAdapter;
  61 import java.awt.event.WindowEvent;
  62 import java.util.logging.Level;
  63 import java.util.logging.Logger;
  64 import javax.swing.BoxLayout;
  65 import javax.swing.JButton;
  66 import javax.swing.JComponent;
  67 import javax.swing.JFrame;
  68 import javax.swing.JLabel;
  69 import javax.swing.JOptionPane;
  70 import javax.swing.JPanel;
  71 import javax.swing.JScrollPane;
  72 import javax.swing.JTable;
  73 import javax.swing.JTextArea;
  74 import javax.swing.JTextField;
  75 import javax.swing.UIManager;
  76 import javax.swing.UIManager.LookAndFeelInfo;
  77 import javax.swing.border.BevelBorder;
  78 
  79 
  80 public final class TableExample implements LayoutManager {
  81 
  82     static String[] ConnectOptionNames = { "Connect" };
  83     static String ConnectTitle = "Connection Information";
  84     Dimension origin = new Dimension(0, 0);
  85     JButton fetchButton;
  86     JButton showConnectionInfoButton;
  87     JPanel connectionPanel;
  88     JFrame frame; // The query/results window.
  89     JLabel userNameLabel;
  90     JTextField userNameField;
  91     JLabel passwordLabel;
  92     JTextField passwordField;
  93     // JLabel      queryLabel;
  94     JTextArea queryTextArea;
  95     JComponent queryAggregate;
  96     JLabel serverLabel;
  97     JTextField serverField;
  98     JLabel driverLabel;
  99     JTextField driverField;
 100     JPanel mainPanel;
 101     TableSorter sorter;
 102     JDBCAdapter dataBase;
 103     JScrollPane tableAggregate;
 104 
 105     /**
 106      * Brigs up a JDialog using JOptionPane containing the connectionPanel.
 107      * If the user clicks on the 'Connect' button the connection is reset.
 108      */
 109     void activateConnectionDialog() {
 110         if (JOptionPane.showOptionDialog(tableAggregate, connectionPanel,
 111                 ConnectTitle,
 112                 JOptionPane.DEFAULT_OPTION, JOptionPane.INFORMATION_MESSAGE,
 113                 null, ConnectOptionNames, ConnectOptionNames[0]) == 0) {
 114             connect();
 115             frame.setVisible(true);
 116         } else if (!frame.isVisible()) {
 117             System.exit(0);
 118         }
 119     }
 120 
 121     /**
 122      * Creates the connectionPanel, which will contain all the fields for
 123      * the connection information.
 124      */
 125     public void createConnectionDialog() {
 126         // Create the labels and text fields.
 127         userNameLabel = new JLabel("User name: ", JLabel.RIGHT);
 128         userNameField = new JTextField("app");
 129 
 130         passwordLabel = new JLabel("Password: ", JLabel.RIGHT);
 131         passwordField = new JTextField("app");
 132 
 133         serverLabel = new JLabel("Database URL: ", JLabel.RIGHT);
 134         serverField = new JTextField("jdbc:derby://localhost:1527/sample");
 135 
 136         driverLabel = new JLabel("Driver: ", JLabel.RIGHT);
 137         driverField = new JTextField("org.apache.derby.jdbc.ClientDriver");
 138 
 139 
 140         connectionPanel = new JPanel(false);
 141         connectionPanel.setLayout(new BoxLayout(connectionPanel,
 142                 BoxLayout.X_AXIS));
 143 
 144         JPanel namePanel = new JPanel(false);
 145         namePanel.setLayout(new GridLayout(0, 1));
 146         namePanel.add(userNameLabel);
 147         namePanel.add(passwordLabel);
 148         namePanel.add(serverLabel);
 149         namePanel.add(driverLabel);
 150 
 151         JPanel fieldPanel = new JPanel(false);
 152         fieldPanel.setLayout(new GridLayout(0, 1));
 153         fieldPanel.add(userNameField);
 154         fieldPanel.add(passwordField);
 155         fieldPanel.add(serverField);
 156         fieldPanel.add(driverField);
 157 
 158         connectionPanel.add(namePanel);
 159         connectionPanel.add(fieldPanel);
 160     }
 161 
 162     public TableExample() {
 163         mainPanel = new JPanel();
 164 
 165         // Create the panel for the connection information
 166         createConnectionDialog();
 167 
 168         // Create the buttons.
 169         showConnectionInfoButton = new JButton("Configuration");
 170         showConnectionInfoButton.addActionListener(new ActionListener() {
 171 
 172             public void actionPerformed(ActionEvent e) {
 173                 activateConnectionDialog();
 174             }
 175         });
 176 
 177         fetchButton = new JButton("Fetch");
 178         fetchButton.addActionListener(new ActionListener() {
 179 
 180             public void actionPerformed(ActionEvent e) {
 181                 fetch();
 182             }
 183         });
 184 
 185         // Create the query text area and label.
 186         queryTextArea = new JTextArea("SELECT * FROM APP.CUSTOMER", 25, 25);
 187         queryAggregate = new JScrollPane(queryTextArea);
 188         queryAggregate.setBorder(new BevelBorder(BevelBorder.LOWERED));
 189 
 190         // Create the table.
 191         tableAggregate = createTable();
 192         tableAggregate.setBorder(new BevelBorder(BevelBorder.LOWERED));
 193 
 194         // Add all the components to the main panel.
 195         mainPanel.add(fetchButton);
 196         mainPanel.add(showConnectionInfoButton);
 197         mainPanel.add(queryAggregate);
 198         mainPanel.add(tableAggregate);
 199         mainPanel.setLayout(this);
 200 
 201         // Create a Frame and put the main panel in it.
 202         frame = new JFrame("TableExample");
 203         frame.addWindowListener(new WindowAdapter() {
 204 
 205             @Override
 206             public void windowClosing(WindowEvent e) {
 207                 System.exit(0);
 208             }
 209         });
 210         frame.setBackground(Color.lightGray);
 211         frame.getContentPane().add(mainPanel);
 212         frame.pack();
 213         frame.setVisible(false);
 214         frame.setBounds(200, 200, 640, 480);
 215 
 216         activateConnectionDialog();
 217     }
 218 
 219     public void connect() {
 220         dataBase = new JDBCAdapter(
 221                 serverField.getText(),
 222                 driverField.getText(),
 223                 userNameField.getText(),
 224                 passwordField.getText());
 225         sorter.setModel(dataBase);
 226     }
 227 
 228     public void fetch() {
 229         dataBase.executeQuery(queryTextArea.getText());
 230     }
 231 
 232     public JScrollPane createTable() {
 233         sorter = new TableSorter();
 234 
 235         //connect();
 236         //fetch();
 237 
 238         // Create the table
 239         JTable table = new JTable(sorter);
 240         // Use a scrollbar, in case there are many columns.
 241         table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
 242 
 243         // Install a mouse listener in the TableHeader as the sorter UI.
 244         sorter.addMouseListenerToHeaderInTable(table);
 245 
 246         JScrollPane scrollpane = new JScrollPane(table);
 247 
 248         return scrollpane;
 249     }
 250 
 251     public static void main(String[] s) {
 252         // Trying to set Nimbus look and feel
 253         try {
 254             for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
 255                 if ("Nimbus".equals(info.getName())) {
 256                     UIManager.setLookAndFeel(info.getClassName());
 257                     break;
 258                 }
 259             }
 260         } catch (Exception ex) {
 261             Logger.getLogger(TableExample.class.getName()).log(Level.SEVERE,
 262                     "Failed to apply Nimbus look and feel", ex);
 263         }
 264 
 265         new TableExample();
 266     }
 267 
 268     public Dimension preferredLayoutSize(Container c) {
 269         return origin;
 270     }
 271 
 272     public Dimension minimumLayoutSize(Container c) {
 273         return origin;
 274     }
 275 
 276     public void addLayoutComponent(String s, Component c) {
 277     }
 278 
 279     public void removeLayoutComponent(Component c) {
 280     }
 281 
 282     public void layoutContainer(Container c) {
 283         Rectangle b = c.getBounds();
 284         int topHeight = 90;
 285         int inset = 4;
 286         showConnectionInfoButton.setBounds(b.width - 2 * inset - 120, inset, 120,
 287                 25);
 288         fetchButton.setBounds(b.width - 2 * inset - 120, 60, 120, 25);
 289         // queryLabel.setBounds(10, 10, 100, 25);
 290         queryAggregate.setBounds(inset, inset, b.width - 2 * inset - 150, 80);
 291         tableAggregate.setBounds(new Rectangle(inset,
 292                 inset + topHeight,
 293                 b.width - 2 * inset,
 294                 b.height - 2 * inset - topHeight));
 295     }
 296 }