2012-10-11 82 views
6

Estoy construyendo una aplicación que constará de pocos paneles con pestañas. En cada uno de ellos, me gustaría poner conjuntos de componentes separados unos de otros por bordes. Que se vería así:Cómo rodear componentes Java Swing con borde?

|- Titled Border 1 --- 

[JTextField] [JComboBox] [JTextField] [JComboBox] 

|-------- 

|- Titled Border 2 --- 

[JTextField] [JComboBox] [JTextField] [JComboBox] 

|-------- 

... and so forth. 

Cuando traté de simplemente añadir nueva frontera, el título 2 de la frontera, al panel, que se añadió cubrieron el primero dejando los componentes en la parte superior sin embargo. En algunos ejemplos, vi muchos JPanels definidos dentro de un marco y cada panel tenía su propio borde. Podría funcionar en mi caso, pero ¿cómo agregar estos paneles para que se muestren dentro de una sola pestaña?

Uno de los tutoriales de Oracle muestra exactamente un panel con pestañas con demostración de muchos tipos de bordes. Cuando intenté editarlo y poner un componente allí, apareció entre dos bordes en lugar de estar rodeado. Y fue otra opción que no tuvo éxito para mí.

En segundo lugar, no uso ningún gestor de diseño, las posiciones de los componentes son fijas y, sinceramente, mantendría esta configuración. ¿O quizás recomiendas usar cualquier administrador de diseño en este caso específico?

¿Tendría alguna pista sobre cómo solucionar este problema?

Editar: parece que no me permiten todavía adjuntar una captura de pantalla, pero aquí está la parte del código que muestra el cuidado de las fronteras:

lenMicro = new JPanel(); 
    lenMicro.setLayout(null); 

    bGreyLine = BorderFactory.createLineBorder(Color.GRAY, 1, true); 
    bTitled1 = BorderFactory.createTitledBorder(bGreyLine, "Length (1/2)", TitledBorder.LEFT, TitledBorder.TOP); 
    lenMicro.setBorder(bTitled1); 
    bTitled2 = BorderFactory.createTitledBorder(bGreyLine, "Length (2/2)", TitledBorder.LEFT, TitledBorder.TOP); 
    lenMicro.setBorder(bTitled2); 

La frontera titulado "Longitud (2/2)" se muestra cuando las dos últimas líneas están sin comentar.

+3

diría - LayoutManager utilizar en el 99,99% de los casos. La única excepción podría ser si proporciona algunos objetos aleatorios, p. usuario dibujando formas. – StanislavL

+0

¿Podría adjuntar algunas capturas de pantalla en lugar de describir la situación? –

+2

La API dice que coloque el borde en el contenedor que contiene el componente. –

Respuesta

15

Al utilizar Absolute Positioning, usted tiene que proporcionar la ubicación de cada uno de los componentes, que se convertirá en una parte de la vista. Por lo tanto, sin mirar exactamente lo que está haciendo, es difícil predecir dónde exactamente van las cosas mal. Aunque usa Layout Managers, eliminará esta gran carga de sus hombros con respecto a la colocación de diferentes componentes en la vista.

Además, debe establecer el borde para el componente respectivo. Por lo tanto, de ninguna manera puedo suponer que usted agregó un componente y apareció entre dos bordes (aunque teniendo en cuenta el hecho de que usted está usando Posicionamiento absoluto, es posible que haya dado las coordenadas incorrectas para dicho componente en la vista). Por favor, eche un vistazo a este código de ejemplo, que la fuerza puede ayudar un poco en esta dirección:

import java.awt.*; 
import javax.swing.*; 
import javax.swing.border.*; 

public class BorderExample 
{ 
    private JPanel topPanel; 
    private JPanel centerPanel; 
    private JPanel bottomPanel; 
    private int hgap; 
    private int vgap; 
    private JTextField tfield1, tfield2; 
    private JComboBox cbox1, cbox2; 
    private String[] data = {"One", "Two"}; 

    public BorderExample() 
    { 
     hgap = 5; 
     vgap = 5; 
    } 

    private void displayGUI() 
    { 
     JFrame frame = new JFrame("Border Example"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     JPanel contentPane = new JPanel(); 
     contentPane.setOpaque(true); 
     contentPane.setBackground(Color.WHITE); 
     contentPane.setBorder(
      BorderFactory.createEmptyBorder(hgap, hgap, hgap, hgap)); 
     contentPane.setLayout(new BorderLayout(hgap, vgap)); 

     topPanel = new JPanel(); 
     topPanel.setOpaque(true); 
     topPanel.setBackground(Color.WHITE); 
     topPanel.setBorder(
      BorderFactory.createTitledBorder("Top Panel")); 
     tfield1 = new JTextField(10); 
     tfield1.setBorder(
      BorderFactory.createTitledBorder(
      BorderFactory.createEtchedBorder(
        EtchedBorder.RAISED, Color.GRAY 
        , Color.DARK_GRAY), "JTextField")); 
     JPanel comboPanel = new JPanel();   
     cbox1 = new JComboBox(data); 
     cbox1.setBorder(
      BorderFactory.createTitledBorder("JComboBox")); 
     topPanel.add(tfield1); 
     topPanel.add(cbox1); 

     centerPanel = new JPanel(); 
     centerPanel.setOpaque(true); 
     centerPanel.setBackground(Color.WHITE); 
     centerPanel.setBorder(
      BorderFactory.createTitledBorder("Center Panel")); 
     tfield2 = new JTextField(10); 
     tfield2.setBorder(
      BorderFactory.createLoweredBevelBorder()); 
     cbox2 = new JComboBox(data); 
     cbox2.setBorder(
      BorderFactory.createRaisedBevelBorder()); 
     centerPanel.add(tfield2); 
     centerPanel.add(cbox2); 

     bottomPanel = new JPanel(); 
     bottomPanel.setOpaque(true); 
     bottomPanel.setBackground(Color.WHITE); 
     bottomPanel.setBorder(
      BorderFactory.createTitledBorder("Center Panel")); 

     contentPane.add(topPanel, BorderLayout.PAGE_START); 
     contentPane.add(centerPanel, BorderLayout.CENTER); 
     contentPane.add(bottomPanel, BorderLayout.PAGE_END); 

     frame.setContentPane(contentPane); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

    public static void main(String... args) 
    { 
     SwingUtilities.invokeLater(new Runnable() 
     { 
      @Override 
      public void run() 
      { 
       new BorderExample().displayGUI(); 
      } 
     }); 
    } 
} 

Aquí está la salida de la misma:

BORDER_EXAMPLE

+0

¡Muchas gracias! Me ayudó a entender cómo van las cosas en este asunto. Decidí usar un administrador de diseño, GridBagLayout, y ahora estoy lidiando con su configuración. Cuando termine, publicaré las partes más relevantes del código. – AbreQueVoy

+0

Asegúrese de preguntar cualquier cosa que pueda causar problemas. Los diseños siempre son buenos. Por lo demás, usted ES LA MÁS BIENVENIDA y MANTENTE SONRIENTE :-) Un [SSCCE] (http://sscce.org/) para trabajar, aún será muy apreciado –

2

bien, así que esto resuelve un gran parte de mis preocupaciones con respecto al uso del Administrador de maquetas y la adición de las fronteras a los grupos de componentes:

import javax.swing.*; 
import javax.swing.border.Border; 
import javax.swing.border.TitledBorder; 
import java.awt.*; 

public class TestingGround extends JFrame { 

private JTextField tLenUnit, tLenResult, tAreUnit, tAreResult; 
private JComboBox<String> cLenInUnit, cLenOutUnit, cAreInUnit, cAreOutUnit; 
private JPanel lenMicro, lenMicro1, lenMicro2, lenNormal, lenMacro, area, volume; 
private Border bGreyLine, bTitled1, bTitled2; 

private TestingGround() { 

    setTitle("Testing Ground for an Application"); 
    setVisible(true); 
    setResizable(true); 
    setLocationRelativeTo(null); 

    try { 
     UIManager.setLookAndFeel("javax.swing.plaf.nimbus.NimbusLookAndFeel"); 
    } catch (ClassNotFoundException e) { 
     e.printStackTrace(); 
    } catch (InstantiationException e) { 
     e.printStackTrace(); 
    } catch (IllegalAccessException e) { 
     e.printStackTrace(); 
    } catch (UnsupportedLookAndFeelException e) { 
     e.printStackTrace(); 
    } 

    lenMicro = new JPanel(); 
    lenMicro.setLayout(new GridBagLayout()); 

    lenMicro1 = new JPanel(); 
    lenMicro1.setLayout(new GridBagLayout()); 

    bGreyLine = BorderFactory.createLineBorder(Color.LIGHT_GRAY, 1, true); 
    bTitled1 = BorderFactory.createTitledBorder(bGreyLine, "Length", TitledBorder.LEFT, TitledBorder.TOP); 
    lenMicro1.setBorder(bTitled1); 

    tLenUnit = new JTextField("0.0"); 
    tLenUnit.setColumns(10); 
    lenMicro1.add(tLenUnit, new GBC(0, 0, 2, 1).setAnchor(GBC.WEST).setInsets(5, 5, 5, 5)); 

    cLenInUnit = new JComboBox<String>(); 
    cLenInUnit.addItem(""); 
    cLenInUnit.addItem("First"); 
    cLenInUnit.addItem("Second"); 
    cLenInUnit.setSelectedIndex(0); 
    cLenInUnit.setPreferredSize(new Dimension(120, 25)); 
    lenMicro1.add(cLenInUnit, new GBC(2, 0, 3, 1)); 

    tLenResult = new JTextField(""); 
    tLenResult.setColumns(10); 
    lenMicro1.add(tLenResult, new GBC(5, 0, 2, 1).setInsets(5, 5, 5, 5)); 

    cLenOutUnit = new JComboBox<String>(); 
    cLenOutUnit.addItem("First"); 
    cLenOutUnit.addItem("Second"); 
    cLenOutUnit.setSelectedIndex(1); 
    cLenOutUnit.setPreferredSize(new Dimension(120, 25)); 
    lenMicro1.add(cLenOutUnit, new GBC(7, 0, 1, 1)); 

    // Area part: 

    lenMicro2 = new JPanel(); 
    lenMicro2.setLayout(new GridBagLayout()); 

    bTitled2 = BorderFactory.createTitledBorder(bGreyLine, "Area", TitledBorder.LEFT, TitledBorder.TOP); 
    lenMicro2.setBorder(bTitled2); 

    tAreUnit = new JTextField("0.0"); 
    tAreUnit.setColumns(10); 
    lenMicro2.add(tAreUnit, new GBC(0, 1, 2, 1).setAnchor(GBC.WEST).setInsets(5, 5, 5, 5)); 

    cAreInUnit = new JComboBox<String>(); 
    cAreInUnit.addItem(""); 
    cAreInUnit.addItem("One sqm"); 
    cAreInUnit.addItem("Two sqm"); 
    cAreInUnit.setSelectedIndex(0); 
    cAreInUnit.setPreferredSize(new Dimension(120, 25)); 
    lenMicro2.add(cAreInUnit, new GBC(2, 1, 3, 1)); 

    tAreResult = new JTextField(""); 
    tAreResult.setColumns(10); 
    lenMicro2.add(tAreResult, new GBC(5, 1, 2, 1).setInsets(5, 5, 5, 5)); 

    cAreOutUnit = new JComboBox<String>(); 
    cAreOutUnit.addItem("One sqm"); 
    cAreOutUnit.addItem("Two sqm"); 
    cAreOutUnit.setSelectedIndex(1); 
    cAreOutUnit.setPreferredSize(new Dimension(120, 25)); 
    lenMicro2.add(cAreOutUnit, new GBC(7, 1, 1, 1)); 

    // Joining all lenMicroX panels into one: 

    lenMicro.add(lenMicro1, new GBC(0, 0, 8, 1).setAnchor(GBC.FIRST_LINE_START).setInsets(5, 5, 5, 5).setIpad(10, 10)); 
    lenMicro.add(lenMicro2, new GBC(0, 1, 8, 1).setAnchor(GBC.LINE_START).setInsets(5, 5, 5, 5).setIpad(10, 10)); 

    volume = new JPanel(); 
    volume.setLayout(null); 

    // Panel definition --begin: 

    JTabbedPane tPane = new JTabbedPane(); 

    tPane.addTab("Length & Area", null, lenMicro, "Length & Area units"); 
    tPane.addTab("Volume", null, volume, "Volume units"); 
    add(tPane); 

    // Panel --end. 
} 

public static void main(String[] args) { 

    TestingGround app = new TestingGround(); 
    app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    app.pack(); 
    app.setVisible(true); 

} 

} 

GridBagConstraints clase de ayuda se toma aquí para allá m Cay Horstmann's y Gary Cornell's Core Java y se pueden encontrar aquí: http://www.horstmann.com/articles/GBC.java.

he conseguido averiguar a partir del ejemplo de Gagandeep que los paneles se pueden poner en la parte superior de, llamémoslo una madre de pantalla. De esta forma, cada uno de los paneles secundarios puede tener su propio borde.

Segunda cosa: decidí usar GridBagLayout, ya que parece ser la más precisa para ser utilizado en este y otros proyectos de la mía.Bueno, todavía tengo que aprender mucho al respecto (por ejemplo, para alinear los componentes con algunas líneas ;-) [edit: acaba de agregar setPreferredSize() a JComboBoxes; hace que el diseño se vea mejor ;-)]).

Gracias a todos por su ayuda y valiosos consejos!

The application after correction.

+1

Solo un consejo, siempre use llamadas como ** frame.setVisible (true/false) **, después de agregar todo al 'JFrame', no antes de eso. De esta manera se presenta a la vista, una vez que se ha dado cuenta de su tamaño. Como ha hecho usted, puede dar resultados anormales a veces, llamando propiedad visible mucho antes de que el marco haya calculado su tamaño. +1 aunque por el esfuerzo que le habías dado a esto :-) –

+1

OK, gracias por tu consejo! (Tendré que hablar con mi profesor entonces, ja, ja :-)) – AbreQueVoy

Cuestiones relacionadas