2012-04-11 2 views
4

Я написал небольшую программу, читая книгу о swing, которая создает JSplitPane между двумя ярлыками. Проблема в том, что JSplitPane едва ли можно увидеть (по крайней мере, в моей операционной системе - MAC OS Lion) и установить некоторые свойства на нем (например, цвет переднего плана), похоже, не работает.Как изменить цвет JSplitPane

Вот код:

//Demonstrate a simple JSplitPane 


package swingexample4_6; 

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

public class SplitPaneDemo { 

    //constructor 
    public SplitPaneDemo() 
    { 
     //Create a new JFrame container. 
     //Use the default border layout 
     JFrame jfrm = new JFrame("Split Pane Demo"); 

     //Give the frame an initial size 
     jfrm.setSize(380, 150); 

     //Terminate the program when the user closes the application 
     jfrm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     //--Make two labels to show the split pane 
     JLabel jlab = new JLabel(" Left side: ABCDEFGHIJKLMNOPQRSTUVWXYZ"); 
     JLabel jlab2 = new JLabel(" Right side: ABCDEFGHIJKLMNOPQRSTUVWXYZ"); 

     //Set the minimum size for each label 
     //This step is not technically needed to use a split pane, 
     //but it enables the split pane resizing features to be 
     //used to their maximum extent 
     jlab.setMinimumSize(new Dimension(90, 30)); 
     jlab2.setMinimumSize(new Dimension(90, 30)); 

     //--Create a split pane 
     JSplitPane jsp = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, true, jlab, jlab2); 

     //Code to get a list of component names in the console 
     Component[] listComponents = jsp.getComponents(); 

     String theList; 
     for (Component myComponent: listComponents) 
     { 
      theList = myComponent.toString(); 
      System.out.println(theList); 
     } 


     //Add the split pane to the content pane 
     jfrm.getContentPane().add(jsp); 

     //Display the frame 
     jfrm.setVisible(true); 
    } 

    public static void main(String[] args) { 
     //Create the frame on the event dispatching thread 
     SwingUtilities.invokeLater(new Runnable(){ 

      @Override 
      public void run() { 
       new SplitPaneDemo(); 
      } 

     }); 
    } 
} 

Есть ли способ, что я могу изменить свой цвет, так что это действительно может выделиться? Спасибо.

+1

Хороший источник: короткие, до точки, очевидно, отформатированных и отображения задачи (графически). +1 –

ответ

5

JLabel по умолчанию NON_Opaque, просто прозрачен, вы можете

  • изменение JLabels к JComponent или JPanel может быть лучше

  • изменение непрозрачности по JLabel#setOpaque(true)

+0

Я бы пошел с 'JLabel.setOpaque (true)' в этом случае, хотя бы для того, чтобы уменьшить количество строк кода от текущего источника до работы. Конечно, вам также необходимо вызвать 'JLabel.setBackground (Color)', что удваивает количество строк. ;) –

+0

+1 Кроме того, задайте цвет фона и/или свойство фона контейнера, как показано [здесь] (http://stackoverflow.com/a/10110232/230513). – trashgod

+0

Я не знал, что свойство свойства по умолчанию для JLabel. – skiabox

7

You может использовать имущество SplitPane.background, так как показано ниже.

SplitPane background

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

/** @see http://stackoverflow.com/a/10110232/230513 */ 
public class SplitPaneDemo { 

    //constructor 
    public SplitPaneDemo() { 
     JFrame jf = new JFrame("Split Pane Demo"); 
     jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     //--Make two labels to show the split pane 
     JPanel left = content("Left side: "); 
     JPanel right = content("Right side: "); 

     //--Create a split pane 
     JSplitPane jsp = new JSplitPane(
      JSplitPane.HORIZONTAL_SPLIT, true, left, right); 
     jsp.setDividerLocation(0.5f); 

     //Add the split pane to the frame's content pane 
     jf.add(jsp); 
     jf.pack(); 

     //Display the frame 
     jf.setLocationRelativeTo(null); 
     jf.setVisible(true); 

     //Code to get a list of component names in the console 
     for (Component myComponent : jsp.getComponents()) { 
      System.out.println(myComponent); 
     } 
    } 

    private JPanel content(String s) { 
     final JLabel label = new JLabel(s + "Some text.", JLabel.CENTER); 
     JPanel panel = new JPanel(new GridLayout()) { 

      @Override 
      public Dimension getPreferredSize() { 
       Dimension d = label.getPreferredSize(); 
       return new Dimension(d.width * 2, d.height * 3); 
      } 
     }; 
     panel.setOpaque(true); 
     panel.setBackground(new Color(0xffffffc0)); 
     panel.add(label); 
     return panel; 
    } 

    public static void main(String[] args) { 
     UIManager.put("SplitPane.background", new Color(0xff8080ff)); 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       new SplitPaneDemo(); 
      } 
     }); 
    } 
} 
+1

См. Также [* Следует ли мне избегать использования методов набора (Предпочтительный | Максимальный | Минимум) в Java Swing? *] (Http://stackoverflow.com/q/7229226/230513). – trashgod

+0

thats correct Я забыл упомянутый 'Whatever # setBackground' +1 – mKorbel

+0

Хорошее решение для этого тоже. У меня есть один вопрос: – skiabox

Смежные вопросы