2015-07-01 2 views
3

im создает таблицу, и в ней есть одна секция, в которой есть все ячейки, где верхняя граница является сплошной линией, но нижняя и правая штрихи. Я выяснил, как индивидуально заставить его не нарисовать одну сторону границы, поэтому я подумал, что могу просто объединить пунктирную и сплошную границу линии, которые пусты, где другой должен рисовать. Вместо этого он просто рисует как верхнюю строчку. Вот мой код:Создание границы, которая является частью пунктирной и сплошной линии

Border empty = BorderFactory.createEmptyBorder(0, -1, -1, -1); 
Border dashed = BorderFactory.createDashedBorder(Color.BLUE, 5, 5); 
Border empty2 = BorderFactory.createEmptyBorder(-1, -1, -1, 0); 
Border line = BorderFactory.createLineBorder(Color.black); 
Border compound1 = new CompoundBorder(empty, line); 
Border compound2= new CompoundBorder(empty2,dashed); 
Border compound = new CompoundBorder(compound1,compound2); 

Вот мой полный код, если вы хотите, чтобы запустить его, чтобы посмотреть, что говорить им о том:

* Class to create the specified table 
* @author CGordo01 
* 
*/ 
public class WordDocumentTable extends JPanel{ 
    Font f; 
    // Holds all the label, is used for resizing 
    ArrayList<JLabel> allLabels= new ArrayList<JLabel>(); 
    /** 
    * Creates the table 
    */ 
    public WordDocumentTable(){ 

     // Sets the layout to a gridBagLayout 
     this.setLayout(new GridBagLayout()); 
     f = new Font("SansSerif", Font.PLAIN, 12); 
     //Adds a component listener 
     this.addComponentListener(new ComponentAdapter() { 
      @Override 
      /** 
      * If the component is resized makes the text fit the dimensions 
      */ 
      public void componentResized(ComponentEvent e) { 
       // Boolean used to see if the text width fits the component. 
       Boolean fits= false; 

       // value used to divide the components height by. 
       double divider = 16; 

       // Makes the font size scale according to the width and height. 
       while(fits == false){ 
        f= f.deriveFont((float) (e.getComponent().getHeight()/divider)); 
        for (int i = 0; i<allLabels.size();i++){ 
         allLabels.get(i).setFont(f); 
         //System.out.println(divider); 
         if(allLabels.get(i).getGraphics().getFontMetrics().stringWidth(allLabels.get(i).getText())>allLabels.get(i).getWidth()){ 
          fits = false; 
          divider++; 
          break; 
         } 
         else{ 
          fits = true; 
         } 

        } 
       } 
      } 
     }); 
     makeLeftCells(); 

     makeMidCells(); 

     makeLongCells(); 

     makeTopCells(); 

    } 
    /** 
    * Creates the cells that are in between widths of the other cells 
    */ 
    private void makeMidCells() { 
     GridBagConstraints midCells = new GridBagConstraints(); 
     midCells.fill= GridBagConstraints.BOTH; 
     midCells.weightx=1; 
     midCells.weighty=1; 
     midCells.gridwidth=4; 
     midCells.gridy=9; 
     midCells.gridx=1; 

     JLabel b = new JLabel(); 
     b.setText(".Batch Total " + " 985124 " + "  Patches "); 
     b.setName("Previous Batch Total"); 
     b.setBackground(Color.white); 
     b.setBorder(new LineBorder(Color.black)); 
     b.setOpaque(true); 
     b.setFont(f); 
     this.add(b,midCells); 

     midCells.gridx=5; 
     JLabel b2 = new JLabel(); 
     b2.setText(".Shift Total " + " 985124 " + "  Patches "); 
     b2.setName("Previous Shift Total"); 
     b2.setBackground(Color.white); 
     b2.setBorder(new LineBorder(Color.black)); 
     b2.setOpaque(true); 
     b2.setFont(f); 
     this.add(b2,midCells); 

     midCells.gridy=12; 
     midCells.gridx=1; 

     JLabel c = new JLabel(); 
     c.setText(".Batch Total " + " 985124 " + "  Patches "); 
     c.setName("Batch Total"); 
     c.setBackground(Color.white); 
     c.setBorder(new LineBorder(Color.black)); 
     c.setOpaque(true); 
     c.setFont(f); 
     this.add(c,midCells); 

     midCells.gridx=5; 
     JLabel c2 = new JLabel(); 
     c2.setText(".Shift Total " + " 985124 " + "  Patches "); 
     c2.setName("Shift Total"); 
     c2.setBackground(Color.white); 
     c2.setBorder(new LineBorder(Color.black)); 
     c2.setOpaque(true); 
     c2.setFont(f); 
     this.add(c2,midCells); 

     allLabels.add(b); 
     allLabels.add(b2); 
     allLabels.add(c); 
     allLabels.add(c2); 
    } 

     /** 
     * Creates the cells which span much of the grid 
     */ 
     private void makeLongCells() { 
      GridBagConstraints longCells = new GridBagConstraints(); 
     longCells.fill= GridBagConstraints.BOTH; 
     longCells.weightx=1; 
     longCells.weighty=1; 
     longCells.gridwidth=8; 
     longCells.gridx=1; 
     longCells.gridy=7; 

     JLabel b = new JLabel(); 
     b.setText("Finish the Batch"); 
     b.setName("Previous Shift Goal"); 
     b.setBackground(Color.white); 
     b.setBorder(new LineBorder(Color.black)); 
     b.setOpaque(true); 
     b.setFont(f); 
     this.add(b,longCells); 

     longCells.gridy=8; 

     JLabel c = new JLabel(); 
     c.setText("<html><p> blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah</p></html>"); 
     c.setName("Previous Shift Notes"); 
     c.setBackground(Color.white); 
     c.setBorder(new LineBorder(Color.black)); 
     c.setOpaque(true); 
     c.setFont(f); 
     this.add(c,longCells); 

     longCells.gridy=10; 

     JLabel d = new JLabel(); 
     d.setText("Shift Goal"); 
     d.setName("Shift Goal"); 
     d.setBackground(Color.white); 
     d.setBorder(new LineBorder(Color.black)); 
     d.setOpaque(true); 
     d.setFont(f); 
     this.add(d,longCells); 

     longCells.gridy=11; 

     JLabel e = new JLabel(); 
     e.setText("Shift Notes"); 
     e.setName("Shift Goal"); 
     e.setBackground(Color.white); 
     e.setBorder(new LineBorder(Color.black)); 
     e.setOpaque(true); 
     e.setFont(f); 
     this.add(e,longCells); 

     longCells.gridy=13; 

     JLabel f2 = new JLabel(); 
     f2.setText(""); 
     f2.setName("WO Schedule Note"); 
     f2.setBackground(Color.white); 
     f2.setBorder(new LineBorder(Color.black)); 
     f2.setOpaque(true); 
     f2.setFont(f); 
     this.add(f2,longCells); 

     longCells.gridy=14; 

     JLabel g = new JLabel(); 
     g.setText(""); 
     g.setName("Supervisor"); 
     g.setBackground(Color.white); 
     g.setBorder(new LineBorder(Color.black)); 
     g.setOpaque(true); 
     g.setFont(f); 
     this.add(g,longCells); 

     allLabels.add(b); 
     allLabels.add(c); 
     allLabels.add(d); 
     allLabels.add(e); 
     allLabels.add(f2); 
     allLabels.add(g); 

    } 
    /** 
    * Creates a 8x7 grid of small cells 
    */ 
    private void makeTopCells() { 
     GridBagConstraints topCells = new GridBagConstraints(); 
     topCells.fill= GridBagConstraints.BOTH; 
     topCells.weighty=1; 
     topCells.weightx=1; 
     for (int i = 0; i < 8; i++) 
     { 
      topCells.gridx=i+1; 
      for (int j = 0; j < 7; j++) 
      { 
       topCells.gridy=j; 
       JLabel b = new JLabel(); 
       b.setText("" + i + j); 
       b.setName("" + i + j); 
       b.setOpaque(true); 
       b.setFont(f); 
       if(j==0){ 
        b.setBackground(new Color(242,242,242)); 
       } 
       else{ 
        b.setBackground(Color.white); 
       } 
       if (j==0){ 
        b.setBorder(new LineBorder(Color.black)); 
       } 
       else{ 
        Border empty = null; 
        Border compound = null; 
        Border dashed = BorderFactory.createDashedBorder(Color.BLUE, 5, 5); 
        if(j==1){ 
        empty = BorderFactory.createEmptyBorder(-1, 0, -1, -1); 
        } 
        else{ 
         empty = BorderFactory.createEmptyBorder(0, 0, -1, -1); 
        } 
        if(j!=4){ 
        compound = new CompoundBorder(empty, dashed); 
        } 
        else{ 
         empty = BorderFactory.createEmptyBorder(0, -1, -1, -1); 
         Border empty2 = BorderFactory.createEmptyBorder(-1, -1, -1, 0); 
         Border line = new LineBorder(Color.black); 
         Border compound1 = new CompoundBorder(empty, line); 
         Border compound2= new CompoundBorder(empty2,dashed); 
         compound = new CompoundBorder(compound1,compound2); 

        } 
        b.setBorder(compound); 
       } 

       allLabels.add(b); 
       this.add(b,topCells); 
      } 
     } 

    } 

    private void makeLeftCells() { 
     GridBagConstraints leftCells = new GridBagConstraints(); 

     leftCells.fill = GridBagConstraints.BOTH; 
     leftCells.gridx = 0; 
     leftCells.gridy = 0; 
     leftCells.weightx=2; 
     leftCells.weighty=1; 

     JLabel titleBlock = new JLabel(); 
     titleBlock.setOpaque(true); 
     titleBlock.setText("Delta Hydrogel A"); 
     titleBlock.setForeground(Color.white); 
     titleBlock.setBackground(new Color(79,129,189)); 
     titleBlock.setBorder(new LineBorder(Color.black)); 
     titleBlock.setFont(f); 

     this.add(titleBlock, leftCells); 

     leftCells.gridy = 1; 
     leftCells.gridheight=3; 

     JLabel tallBlock1 = new JLabel(); 
     tallBlock1.setOpaque(true); 
     tallBlock1.setText(".Day Shift"); 
     tallBlock1.setForeground(Color.black); 
     tallBlock1.setBackground(new Color(242,242,242)); 
     tallBlock1.setBorder(new LineBorder(Color.black)); 
     tallBlock1.setFont(f); 
     this.add(tallBlock1, leftCells); 



     JLabel tallBlock2 = new JLabel(); 
     tallBlock2.setOpaque(true); 
     tallBlock2.setText(".Night Shift"); 
     tallBlock2.setForeground(Color.black); 
     tallBlock2.setBackground(new Color(242,242,242)); 
     tallBlock2.setBorder(new LineBorder(Color.black)); 
     tallBlock2.setFont(f); 
     leftCells.gridy = 4; 

     this.add(tallBlock2, leftCells); 

     JLabel shortBlock1 = new JLabel(); 
     shortBlock1.setOpaque(true); 
     shortBlock1.setText(".Previous Shift Goal"); 
     shortBlock1.setForeground(Color.black); 
     shortBlock1.setBackground(new Color(242,242,242)); 
     shortBlock1.setBorder(new LineBorder(Color.black)); 
     shortBlock1.setFont(f); 
     leftCells.gridy = 7; 
     leftCells.gridheight=1; 

     this.add(shortBlock1, leftCells); 

     JLabel shortBlockTall = new JLabel(); 
     shortBlockTall.setOpaque(true); 
     shortBlockTall.setText(".Previous Shift Notes"); 
     shortBlockTall.setForeground(Color.black); 
     shortBlockTall.setBackground(new Color(242,242,242)); 
     shortBlockTall.setBorder(new LineBorder(Color.black)); 
     shortBlockTall.setFont(f); 
     leftCells.gridy = 8; 
     leftCells.ipady=50; 

     this.add(shortBlockTall, leftCells); 

     JLabel shortBlock2 = new JLabel(); 
     shortBlock2.setOpaque(true); 
     shortBlock2.setText(".Previous Shift Output"); 
     shortBlock2.setForeground(Color.black); 
     shortBlock2.setBackground(new Color(242,242,242)); 
     shortBlock2.setBorder(new LineBorder(Color.black)); 
     shortBlock2.setFont(f); 
     leftCells.gridy = 9; 
     leftCells.ipady=0; 


     this.add(shortBlock2, leftCells); 

     JLabel shortBlock3 = new JLabel(); 
     shortBlock3.setOpaque(true); 
     shortBlock3.setText(".Shift Goals"); 
     shortBlock3.setForeground(Color.black); 
     shortBlock3.setBackground(new Color(184,204,228)); 
     shortBlock3.setBorder(new LineBorder(Color.black)); 
     shortBlock3.setFont(f); 
     leftCells.gridy = 10; 
     leftCells.ipady=0; 


     this.add(shortBlock3, leftCells); 


     JLabel shortBlock4 = new JLabel(); 
     shortBlock4.setOpaque(true); 
     shortBlock4.setText(".Shift Notes"); 
     shortBlock4.setForeground(Color.black); 
     shortBlock4.setBackground(new Color(184,204,228)); 
     shortBlock4.setBorder(new LineBorder(Color.black)); 
     shortBlock4.setFont(f); 
     leftCells.gridy = 11; 
     leftCells.ipady=0; 


     this.add(shortBlock4, leftCells); 

     JLabel shortBlock5 = new JLabel(); 
     shortBlock5.setOpaque(true); 
     shortBlock5.setText(".Output"); 
     shortBlock5.setForeground(Color.black); 
     shortBlock5.setBackground(new Color(184,204,228)); 
     shortBlock5.setBorder(new LineBorder(Color.black)); 
     shortBlock5.setFont(f); 
     leftCells.gridy = 12; 


     this.add(shortBlock5, leftCells); 

     JLabel shortBlock6 = new JLabel(); 
     shortBlock6.setOpaque(true); 
     shortBlock6.setText(".WO Schedule Note"); 
     shortBlock6.setForeground(Color.black); 
     shortBlock6.setBackground(new Color(184,204,228)); 
     shortBlock6.setBorder(new LineBorder(Color.black)); 
     shortBlock6 .setFont(f); 
     leftCells.gridy = 13; 

     this.add(shortBlock6, leftCells); 

     JLabel shortBlock7 = new JLabel(); 
     shortBlock7.setOpaque(true); 
     shortBlock7.setText(".Supervisor"); 
     shortBlock7.setForeground(Color.black); 
     shortBlock7.setBackground(new Color(184,204,228)); 
     shortBlock7.setBorder(new LineBorder(Color.black)); 
     shortBlock7.setFont(f); 
     leftCells.gridy = 14; 

     this.add(shortBlock7, leftCells); 

     allLabels.add(titleBlock); 
     allLabels.add(tallBlock1); 
     allLabels.add(tallBlock2); 
     allLabels.add(shortBlock1); 
     allLabels.add(shortBlockTall); 
     allLabels.add(shortBlock2); 
     allLabels.add(shortBlock3); 
     allLabels.add(shortBlock4); 
     allLabels.add(shortBlock5); 
     allLabels.add(shortBlock6); 
     allLabels.add(shortBlock7); 



    } 
    public static void main (String[] args) 
    { 
     JFrame J = new JFrame(); 
     J.setSize(1600,900); 
     J.setVisible(true); 


     WordDocumentTable wdc= new WordDocumentTable(); 

     J.setContentPane(wdc); 
     J.setVisible(true); 
     J.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    } 

} 
+0

'Вместо этого он просто рисует как на верхней строке.« Я вижу сплошную верхнюю строку и пунктирную линию, когда я запускаю ваш код. Отправьте правильный [Runnable Example] (http://sscce.org/), который демонстрирует проблему. – camickr

+0

Эй, я отправил свой полный код для таблицы. Я знаю, что мог бы сократить его очень сильно, но он работает в этом примере и, надеюсь, вы можете видеть, что я собираюсь, а проблема –

+0

Не успели посмотреть на весь этот код. 'Я знаю, что я мог бы сократить его, но он работает в этом примере' - так что вы доказали, что код работает. Теперь вам нужно определить, что отличается между сокращенной версией и полной версией. Начните с добавления небольшого количества кода в короткую версию и теста, пока он не сломается. Затем, когда он ломается, вы знаете, что изменилось, и вы можете сосредоточить свои усилия на отладке. – camickr

ответ

-1

Я думаю, что вы должны реализовать свои собственные границы.

+0

(-1), я уже говорил, что код работает для меня, и OP уже заявил, что он работает для него, когда он создал демо-программу, поэтому проблема не в Border. – camickr

+0

Ну, я отправил свое предложение * до того, как * OP заявил, что он работает. Более того, даже если это работает, это не значит, что оно правильно. EmptyBorder с отрицательными вставками не имеет большого смысла для меня. – andronix

0

Ну, я не уверен, что понимаю, но я заработал. Я изменил первый параметр на пустой границе, которая была для черты линии до -2. Мое рассуждение было -1 не работает, давайте попробуем -2.

Border empty = BorderFactory.createEmptyBorder(0, -1, -1, -1); 
Border dashed = BorderFactory.createDashedBorder(Color.BLUE, 5, 5); 
Border empty2 = BorderFactory.createEmptyBorder(-2, -1, -1, 0); 
Border line = BorderFactory.createLineBorder(Color.black); 
Border compound1 = new CompoundBorder(empty, line); 
Border compound2= new CompoundBorder(empty2,dashed); 
Border compound = new CompoundBorder(compound1,compound2); 
Смежные вопросы