2012-08-29 193 views
1

所以,我有一個問題。我有一個JPanel(BoxLayout,Y_AXIS)。其中,我有JLabelJTextAreaJTextArea隨着文本的填充而自由擴展,擴展了JPanelJLabel對齊問題

JLabel擴展到。只要文本垂直對齊頂部就行了。但該命令由於某種原因不起作用(setVerticalTextPosition,setVerticalAlignment,setAlignmentX)。我認爲第一個是Java中的一個bug。

由於沒有工作,我試圖膠合JLabel頂端邊框。 我也已將所有三個setXXSize設置爲SAM值以保持JLabel的大小不變。

,但它只是不會堅持,取決於它要麼捕捉到中心或只是填滿整個JPanel佈局。

現在,我不在乎如何,但我需要的是在JLabel佔用的空間中頂部對齊的幾個字母(如果它有所作爲,我甚至可以使用另一個JTextComponent)。有沒有辦法做到這一點?

我會爲您提供代碼,但它幾乎是我上面寫的,因爲JPanel是更復雜的GUI的一部分,所以我真的必須給你整個代碼... (我會,如果它將需要。)

package core; 

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Component; 
import java.awt.Dimension; 
import java.awt.FlowLayout; 
import java.awt.Font; 
import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 
import java.awt.event.WindowEvent; 
import java.awt.event.WindowListener; 
import java.io.FileInputStream; 
import java.io.FileNotFoundException; 
import java.io.IOException; 
import java.util.ArrayList; 
import java.util.Locale; 
import java.util.Properties; 
import java.util.ResourceBundle; 

import javax.swing.BorderFactory; 
import javax.swing.Box; 
import javax.swing.BoxLayout; 
import javax.swing.ButtonGroup; 
import javax.swing.JButton; 
import javax.swing.JDialog; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JMenu; 
import javax.swing.JMenuBar; 
import javax.swing.JMenuItem; 
import javax.swing.JPanel; 
import javax.swing.JRadioButton; 
import javax.swing.JScrollPane; 
import javax.swing.JTextArea; 
import javax.swing.KeyStroke; 
import javax.swing.border.Border; 
import javax.swing.text.AbstractDocument; 
import javax.swing.text.AttributeSet; 
import javax.swing.text.BadLocationException; 
import javax.swing.text.DocumentFilter; 



@SuppressWarnings("serial") 
class DefaultFont extends Font 
{ 
    public DefaultFont() 
    { 
     super("Arial", PLAIN, 20); 
    } 
} 


@SuppressWarnings("serial") 
class Page extends JPanel 
{ 
    public JPanel largePage; 
    public int content; 

    public Page(JPanel panel, int index) 
    { 
     largePage = new JPanel(); 
     largePage.setLayout(new BoxLayout(largePage, BoxLayout.Y_AXIS)); 
     largePage.setMaximumSize(new Dimension(794, 1123)); 
     largePage.setPreferredSize(new Dimension(794, 1123)); 
     largePage.setAlignmentX(Component.CENTER_ALIGNMENT); 
     largePage.setBackground(Color.WHITE); 
     largePage.add(new Box.Filler(new Dimension(0, 96), new Dimension(0, 96), new Dimension(0, 96))); 

     setMaximumSize(new Dimension(556, 931)); 
     setBackground(Color.LIGHT_GRAY); 
     setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); 
     add(new Box.Filler(new Dimension(556, 0), new Dimension(556, 931), new Dimension(556, 931))); 

     largePage.add(this); 
     largePage.add(new Box.Filler(new Dimension(0, 96), new Dimension(0, 96), new Dimension(0, 96))); 

     panel.add(largePage, index); 
     panel.add(new Box.Filler(new Dimension(0, 40), new Dimension(0, 40), new Dimension(0, 40))); 

     content = 0; 

     Main.pages.add(this); 
    } 
} 

@SuppressWarnings("serial") 
class Heading extends JTextArea 
{ 
    public boolean type; 
    public AbstractDocument doc; 
    public ArrayList<JPanel/*Question*/> questions; 
    public ArrayList<JPanel/*List*/> list; 

    public Heading(boolean segment, Page page) 
    { 
     type = segment; 

     setBackground(Color.RED); 
     setFont(new Font("Arial", Font.BOLD, 20)); 

     Border in = BorderFactory.createDashedBorder(Color.BLACK); 
     Border out = BorderFactory.createMatteBorder(0, 0, 10, 0, Color.WHITE); 

     setBorder(BorderFactory.createCompoundBorder(out, in)); 
     setLineWrap(true); 
     setWrapStyleWord(true); 

     setText("Heading 1 Heading 1 Heading 1 Heading 1"); 

     doc = (AbstractDocument)this.getDocument(); 
     doc.setDocumentFilter(new DocumentFilter() 
     { 
      public void insertString(FilterBypass fb, int offs,String str, AttributeSet a) throws BadLocationException 
      { 
       if ((fb.getDocument().getLength() + str.length()) <= 150) 
       { 
        ; 
        fb.insertString(offs, str.replaceAll("\n", " "), a); 
       } 
       else 
       { 
        int spaceLeft = 150 - fb.getDocument().getLength(); 
        if (spaceLeft <= 0) 
         return; 

        fb.insertString(offs, str.substring(0,spaceLeft).replaceAll("\n", " "), a); 
       } 
      } 

      public void replace(FilterBypass fb, int offs, int length, String str, AttributeSet a) throws BadLocationException 
      { 
       if (str.equals("\n")) 
       { 
        str = ""; 
       } 
       if ((fb.getDocument().getLength() + str.length() - length) <= 150) 
       { 
        fb.replace(offs, length, str.replaceAll("\n", " "), a); 
       } 
       else 
       { 
        int spaceLeft = 150 - fb.getDocument().getLength() + length; 
        if (spaceLeft <= 0) 
         return; 

        fb.replace(offs, length, str.substring(0,spaceLeft).replaceAll("\n", " "), a); 
       } 
      } 
     }); 

     page.add(this, 0); 
     page.content++; 

     if (type) 
     { 
      questions = new ArrayList<JPanel>(); 
     } 
     else 
     { 
      list = new ArrayList<JPanel>(); 
     } 
    } 
} 

@SuppressWarnings("serial") 
class Question extends JPanel 
{ 
    public JPanel questionArea, numberArea, answerArea; 
    public JLabel number; 
    public JTextArea question; 

    public Question(Page page, int pageNum, int index) 
    { 
     setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); 

     questionArea = new JPanel(); 
     questionArea.setLayout(new BoxLayout(questionArea, BoxLayout.X_AXIS)); 

     numberArea = new JPanel(); 
     numberArea.setLayout(new BoxLayout(numberArea, BoxLayout.Y_AXIS)); 
     numberArea.setBackground(Color.YELLOW); 

     number = new JLabel(pageNum+".", JLabel.RIGHT); 
     number.setMinimumSize(new Dimension(100, 20)); 
     number.setPreferredSize(new Dimension(100, 20)); 
     number.setMaximumSize(new Dimension(100, 20)); 
     //number.setAlignmentX(TOP_ALIGNMENT); 
     number.setFont(new Font("Arial", Font.PLAIN, 18)); 
     number.setBackground(Color.BLUE); 

     numberArea.add(number); 

     //numberArea.add(new Box.Filler(new Dimension(40, 0), new Dimension(40, 30), new Dimension(40, 300)), BorderLayout.CENTER); 

     questionArea.add(numberArea); 

     question = new JTextArea(); 
     question.setFont(new Font("Arial", Font.PLAIN, 18)); 
     question.setLineWrap(true); 
     question.setWrapStyleWord(true); 
     question.setBackground(Color.GREEN); 

     question.setText("dafd afdfd fasdfsdaah fg dfgd"); 



     questionArea.add(question); 

     add(questionArea); 
     page.add(this, index); 
    } 
} 



public class Main 
{ 

    public static Properties config; 
    public static Locale currentLocale; 
    public static ResourceBundle lang; 

    public static JFrame mWindow; 

    public static JMenuBar menu; 
    public static JMenu menuFile, menuEdit; 
    public static JMenuItem itmNew, itmClose, itmLoad, itmSave, itmSaveAs, itmExit, itmCut, itmCopy, itmPaste, itmProperties; 

    public static JDialog newDoc; 
    public static JLabel newDocText1, newDocText2; 
    public static JRadioButton questions, list; 
    public static ButtonGroup newDocButtons; 
    public static JButton newDocOk; 
    public static Boolean firstSegment; 

    public static JPanel workspace; 
    public static JScrollPane scroll; 
    public static ArrayList<Page> pages; 


    public static void newDocumentForm() 
    { 
     //new document dialog 
     mWindow.setEnabled(false); 

     newDoc = new JDialog(mWindow, "newDoc"); 
     newDoc.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); 
     newDoc.addWindowListener(new WindowListener() 
     { 
      public void windowActivated(WindowEvent arg0) {} 
      public void windowClosing(WindowEvent arg0) 
      { 
       mWindow.toFront(); 

       newDocText1 = null; 
       newDocText2 = null; 
       questions = null; 
       list = null; 
       newDocButtons = null; 
       newDocOk = null; 
       newDoc.dispose(); 

       mWindow.setEnabled(true);    
      } 

      public void windowClosed(WindowEvent arg0) {} 
      public void windowDeactivated(WindowEvent arg0) {} 
      public void windowDeiconified(WindowEvent arg0) {} 
      public void windowIconified(WindowEvent arg0) {} 
      public void windowOpened(WindowEvent arg0) {} 
     }); 

     newDoc.setSize(400, 200); 
     newDoc.setLocationRelativeTo(null); 
     newDoc.setResizable(false); 
     newDoc.setLayout(null); 
     newDoc.setVisible(true); 

     newDocText1 = new JLabel("newDocText1"); 
     newDocText1.setBounds(5, 0, 400, 20); 

     newDocText2 = new JLabel("newDocText2"); 
     newDocText2.setBounds(5, 20, 400, 20); 

     newDoc.add(newDocText1); 
     newDoc.add(newDocText2); 

     firstSegment = true; 

     questions = new JRadioButton("questions"); 
     questions.setSelected(true); 
     questions.setFocusPainted(false); 
     questions.setBounds(10, 60, 400, 20); 
     questions.addActionListener(new ActionListener() 
     { 
      public void actionPerformed(ActionEvent arg0) 
      { 
       firstSegment = true; 
      } 
     }); 

     list = new JRadioButton("list"); 
     list.setFocusPainted(false); 
     list.setBounds(10, 80, 400, 20); 
     list.addActionListener(new ActionListener() 
     { 
      public void actionPerformed(ActionEvent arg0) 
      { 
       firstSegment = false; 
      } 
     }); 

     newDoc.add(questions); 
     newDoc.add(list); 

     newDocButtons = new ButtonGroup(); 
     newDocButtons.add(questions); 
     newDocButtons.add(list); 

     newDocOk = new JButton("ok"); 
     newDocOk.addKeyListener(new KeyListener() 
     { 
      public void keyPressed(KeyEvent e) 
      { 
       if (e.getKeyCode() == KeyEvent.VK_ENTER) 
       { 
        newDocOk.doClick(); 
       } 
      } 

      public void keyReleased(KeyEvent e) {} 
      public void keyTyped(KeyEvent e) {} 
     }); 

     newDocOk.setFocusPainted(false); 
     newDocOk.setBounds(160, 120, 80, 40); 
     newDocOk.setMnemonic(KeyEvent.VK_ACCEPT); 
     newDocOk.addActionListener(new ActionListener() 
     { 
      public void actionPerformed(ActionEvent arg0) 
      { 
       createNewDocument(); 
      } 
     }); 

     newDoc.add(newDocOk); 
     newDocOk.requestFocus(); 
    } 

    public static void createNewDocument() 
    { 
     //dispose of new document dialog 
     mWindow.toFront(); 

     newDocText1 = null; 
     newDocText2 = null; 
     questions = null; 
     list = null; 
     newDocButtons = null; 
     newDocOk = null; 
     newDoc.dispose(); 

     mWindow.setEnabled(true); 

     //create document display    
     workspace = new JPanel(); 
     workspace.setLayout(new BoxLayout(workspace, BoxLayout.PAGE_AXIS)); 
     workspace.add(new Box.Filler(new Dimension(0, 40), new Dimension(0, 40), new Dimension(0, 40))); 
     workspace.setBackground(Color.BLACK); 

     scroll = new JScrollPane(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); 
     scroll.getVerticalScrollBar().setUnitIncrement(20); 
     scroll.setViewportView(workspace); 

     pages = new ArrayList<Page>(); 

     @SuppressWarnings("unused") 
     Page p = new Page(workspace, 1); 

     Heading g = new Heading(true, p); 

     Question q = new Question(p, 1, 1); 

     mWindow.add(scroll, BorderLayout.CENTER); 
     mWindow.repaint(); 
     mWindow.validate(); 

    } 

    public static void main(String[] args) throws FileNotFoundException, IOException 
    { 

     //create main window 
     mWindow = new JFrame("title"); 
     mWindow.setSize(1000, 800); 
     mWindow.setMinimumSize(new Dimension(1000, 800)); 
     mWindow.setLocationRelativeTo(null); 
     mWindow.setLayout(new BorderLayout()); 
     mWindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     mWindow.setVisible(true); 

     //create menu bar 
     menu = new JMenuBar(); 

     menuFile = new JMenu("file"); 
     menuEdit = new JMenu("edit"); 

     itmNew = new JMenuItem("new"); 
     itmNew.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N, ActionEvent.CTRL_MASK)); 
     itmNew.addActionListener(new ActionListener() 
     { 
      public void actionPerformed(ActionEvent e) 
      { 
       newDocumentForm(); 
      } 
     }); 

     itmClose = new JMenuItem("close"); 
     itmClose.setActionCommand("Close"); 
     itmClose.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_W, ActionEvent.CTRL_MASK)); 

     itmLoad = new JMenuItem("load"); 
     itmLoad.setActionCommand("Load"); 
     itmLoad.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_L, ActionEvent.CTRL_MASK)); 

     itmSave = new JMenuItem("save"); 
     itmSave.setActionCommand("Save"); 
     itmSave.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, ActionEvent.CTRL_MASK)); 

     itmSaveAs = new JMenuItem("saveAs"); 
     itmSaveAs.setActionCommand("SaveAs"); 
     itmExit = new JMenuItem("exit"); 
     itmExit.addActionListener(new ActionListener() 
     { 
      public void actionPerformed(ActionEvent e) 
      { 
       //Add confirmation window! 
       System.exit(0); 
      } 
     }); 


     itmCut = new JMenuItem("cut"); 
     itmCut.setActionCommand("Cut"); 
     itmCut.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X, ActionEvent.CTRL_MASK)); 

     itmCopy = new JMenuItem("copy"); 
     itmCopy.setActionCommand("Copy"); 
     itmCopy.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C, ActionEvent.CTRL_MASK)); 

     itmPaste = new JMenuItem("paste"); 
     itmPaste.setActionCommand("Paste"); 
     itmPaste.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_V, ActionEvent.CTRL_MASK)); 

     itmProperties = new JMenuItem("properties"); 
     itmProperties.setActionCommand("properties"); 
     itmProperties.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_P, ActionEvent.CTRL_MASK)); 

     menuFile.add(itmNew); 
     menuFile.add(itmClose); 
     menuFile.addSeparator(); 
     menuFile.add(itmLoad); 
     menuFile.addSeparator(); 
     menuFile.add(itmSave); 
     menuFile.add(itmSaveAs); 
     menuFile.addSeparator(); 
     menuFile.add(itmExit); 

     menuEdit.add(itmCut); 
     menuEdit.add(itmCopy); 
     menuEdit.add(itmPaste); 
     menuEdit.addSeparator(); 
     menuEdit.add(itmProperties); 

     menu.add(menuFile); 
     menu.add(menuEdit); 

     //create actionListener for menus 



     mWindow.add(menu, BorderLayout.NORTH); 

     mWindow.repaint(); 
     mWindow.validate(); 
    } 
} 

這是我可以做的最好的,參考問題類的問題。 要獲取GUI繪製,請運行它,按Ctrl + n,然後輸入。

+2

您有[SSCCE](http://sscce.org/)我們可以玩 – MadProgrammer

+0

我無法真正提取SSCCE ... 您有整個代碼,但問題類是一個問題,你幾乎可以忽略其他的一切。 – Karlovsky120

回答

2

我的理解要實現這一點:

enter image description here

如果這是真的,所有你需要做的是這樣的:

numberArea.setLayout(new BorderLayout()); 

numberArea.add(number,BorderLayout.NORTH); 
+1

P.S.學習使用佈局的Karlovsky。 –

2

正如brano88所建議的,更改佈局管理器...

public Question(Page page, int pageNum, int index) { 
    setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); 

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

    numberArea = new JPanel(); 
    numberArea.setLayout(new BoxLayout(numberArea, BoxLayout.Y_AXIS)); 
    numberArea.setBackground(Color.YELLOW); 

    number = new JLabel(pageNum + ".", JLabel.RIGHT); 
    number.setMinimumSize(new Dimension(100, 20)); 
    number.setPreferredSize(new Dimension(100, 20)); 
    number.setMaximumSize(new Dimension(100, 20)); 
    //number.setAlignmentX(TOP_ALIGNMENT); 
    number.setFont(new Font("Arial", Font.PLAIN, 18)); 
    number.setBackground(Color.BLUE); 

    numberArea.add(number); 

    //numberArea.add(new Box.Filler(new Dimension(40, 0), new Dimension(40, 30), new Dimension(40, 300)), BorderLayout.CENTER); 

    GridBagConstraints gbc = new GridBagConstraints(); 
    gbc.gridx = 0; 
    gbc.gridy = 0; 
    gbc.fill = GridBagConstraints.VERTICAL; 
    gbc.anchor = GridBagConstraints.NORTH; 
    questionArea.add(numberArea, gbc); 

    question = new JTextArea(); 
    question.setFont(new Font("Arial", Font.PLAIN, 18)); 
    question.setLineWrap(true); 
    question.setWrapStyleWord(true); 
    question.setBackground(Color.GREEN); 

    question.setText("dafd afdfd fasdfsdaah fg dfgd"); 


    gbc.gridx = 1; 
    gbc.gridy = 0; 
    gbc.fill = GridBagConstraints.BOTH; 
    gbc.weightx = 1; 
    gbc.weighty = 1; 
    gbc.anchor = GridBagConstraints.NORTH; 
    questionArea.add(question, gbc); 

    add(questionArea); 
    page.add(this, index); 
}