2012-06-07 1 views

ответ

5
  • использование JSeparator вместо EtchedBorder.Lowered,

  • но JSeparator по умолчанию только линии, но вы можете создать забавные Borders

enter image description here

import java.awt.BorderLayout; 
import java.awt.Dimension; 
import javax.swing.BorderFactory; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JSeparator; 
import javax.swing.SwingUtilities; 

public class NestedLayout { 

    private JFrame frame = new JFrame(); 
    private JPanel leftPanel = new JPanel(); 

    public NestedLayout() { 
     leftPanel.setLayout(new BorderLayout()); 
     leftPanel.setBorder(BorderFactory.createEmptyBorder(
       10, //top 
       10, //left 
       10, //bottom 
       10)); //right 
     leftPanel.add(new JSeparator(JSeparator.VERTICAL), BorderLayout.CENTER); 
     leftPanel.setPreferredSize(new Dimension(40, 40)); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(leftPanel, BorderLayout.WEST); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       new NestedLayout(); 
      } 
     }); 
    } 
} 
+0

Возможно ли использовать JSeparator с использованием FlowLayout? Это то, что я имею в настоящее время с реализацией FlowLayout, используя JSeparator для разделения JLabels для строки состояния. http://pastebin.com/J79DsqMJ – samwell

4

Вы можете присоединиться к двум панелям и добавить «противоположную» матовую границу на каждый воссоздать травление эффект:

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

public class MainFrame extends JFrame { 

    public MainFrame() { 
     setLayout(new BorderLayout()); 

     JPanel left = new JPanel(); 
     left.setPreferredSize(new Dimension(200, 400)); 
     left.setBorder(BorderFactory.createMatteBorder(0, 0, 0, 1, Color.GRAY)); 
     add(left, BorderLayout.WEST); 

     JPanel center = new JPanel(); 
     center.setPreferredSize(new Dimension(200, 400)); 
     center.setBorder(BorderFactory.createMatteBorder(0, 1, 0, 0, Color.WHITE)); 
     add(center, BorderLayout.CENTER); 

     setVisible(true); 
     pack(); 
    } 

    public static void main(String[] args) { 
     new MainFrame(); 
    } 
} 

enter image description here

+0

Если JSeparator не работает с панелью с FlowLayout, я могу просто использовать это. – samwell

+1

хорошая идея с границами +1 – mKorbel

2

Вы можете легко создать свой собственный класс границы по югу причислять Окаймление или AbstractBorder.

Этот код будет делать именно то, что вы просили: EtchedBorder, нарисованный только с одной стороны. Но это выглядит не очень хорошо. EtchedBorder просто рисует две линии (один темный, один свет) с каждой стороны. Он получает трехмерный вид от того, как линии встречаются по углам. Без полного рисования он не выглядит трехмерным.

setBorder(new EtchedBorder() { 
    public void paintBorder(Component c, Graphics g, int x, int y, int width, int height) { 
    g.setColor(getShadowColor(c)); 
    g.drawLine(x, y + height - 2, x, y); 

    g.setColor(getHighlightColor(c)); 
    g.drawLine(x+1, y + height - 3, x+1, y + 1); 
    } 
}); 
2

Расширение на ответе дается Yanflea, где вы создаете «противоположность» из двух разных панелей тиражировать вид травления границы.

Вы можете создать его на одной панели с помощью CompoundBorder так:

CompoundBorder border = BorderFactory.createCompoundBorder(
      BorderFactory.createMatteBorder(0, 0, 1, 0, Color.WHITE), 
      BorderFactory.createMatteBorder(0, 0, 1, 0, Color.GRAY) 
     ); // This would create A line on the bottom 

Преимущества делать таким образом, что вы можете также сделать две стороны, которые затем выглядят следующим образом: (Обратите внимание, что это только сетка из девяти панелей и только середина имеет границу, которая также толще, чем 1 См ниже код, который я использовал setBackground на панели, чтобы показать, где каждая панель была)

enter image description here!

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

public class Test 
{ 
    public static void main(String[] args) 
    { 
     JFrame f = new JFrame("A Demo"); 
     f.setLayout(new GridLayout(3,3)); 
     f.setSize(400,400); 
     JPanel j1 = new JPanel();  //j1.setBackground(new Color(255,0,0)); 
     JPanel j2 = new JPanel();  //j2.setBackground(new Color(200,0,0)); 
     JPanel j3 = new JPanel();  //j3.setBackground(new Color(150,0,0)); 
     JPanel j4 = new JPanel();  //j4.setBackground(new Color(100,0,0)); 
     JPanel j5 = new JPanel();  //j5.setBackground(new Color(0,255,0)); 
     JPanel j6 = new JPanel();  //j6.setBackground(new Color(0,200,0)); 
     JPanel j7 = new JPanel();  //j7.setBackground(new Color(50,0,0)); 
     JPanel j8 = new JPanel();  //j8.setBackground(new Color(0,150,0)); 
     JPanel j9 = new JPanel();  //j9.setBackground(new Color(0,100,0)); 
     j5.setBorder(BorderFactory.createCompoundBorder(
       BorderFactory.createMatteBorder(0, 0, 2, 2, Color.WHITE), 
       BorderFactory.createMatteBorder(0, 0, 2, 2, Color.GRAY) 
      )); 
     f.add(j1); 
     f.add(j2); 
     f.add(j3); 
     f.add(j4); 
     f.add(j5); 
     f.add(j6); 
     f.add(j7); 
     f.add(j8); 
     f.add(j9); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.setVisible(true); 
    } 
} 
Смежные вопросы