Custom multiline table header

I was trying to set JPanel with two inner components (JTextField and JLabel) as header renderer. When I put this component to JFrame text field is editable, but when it appears in my custom table header it is disabled or not focusable, that part I couldn't figure out. I thought that I can find where all header components are and make them enabled/focusable, but I couldn't figure that out either.
Please help!!
:-|

A renderer is simply used to paint the contents of the header;
it is not a child of the JTableHeader or anything like that. If
you want the text field in the renderer to be editable, you are
going to have to handle that yourself by taking care of
all the necessary events, etc.

Similar Messages

  • Groupable + multiline table header paint problem

    hi, i try to make a groupable + multiline table header
    based on Nobuo Tamesama's code...
    there are some problems which i considered tolerable except one...
    the header didn't paint correctly when i set the autoResizeMode into autoresizemode_off
    and resize the columns pass the scrollpane width...
    thx in advance
    here's the complete code :
    import java.io.*;
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    import javax.swing.table.*;
    import java.util.*;
    import javax.swing.border.*;
    import javax.swing.plaf.basic.*;
    public class GroupableHeaderExample extends JFrame {
        GroupableHeaderExample() {
            super("Groupable Header Example");
            JScrollPane sp = new JScrollPane();
            Object[][] data = {{"b1k1", "b1k2", "b1k3", "b1k4", "b1k5"}, {"b2k1", "b2k2", "b2k3", "b2k4", "b2k5"}};
            JTable table = new JTable(new DefaultTableModel(data, new Object[]{"Kol1", "Kol2\nmmm", "Kol3", "kol4\nmmm\nnnn", " \n \nKol5\nmmm"})) {
                protected JTableHeader createDefaultTableHeader() {
                    return new GroupableTableHeader(columnModel);
            table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
            ColumnGroup cg = new ColumnGroup("CG", 0, 3);
            ColumnGroup cg2 = new ColumnGroup("CG2\nmmm", 1, 3);
            ColumnGroup cg3 = new ColumnGroup("CG3", 1, 2);
            GroupableTableHeader header = (GroupableTableHeader)table.getTableHeader();
            header.addColumnGroup(cg3);
            header.addColumnGroup(cg);
            header.addColumnGroup(cg2);
            header.fitHeight();
            sp.setViewportView(table);
            getContentPane().add(sp);
            setSize(400, 300);  
        public static void main(String[] args) {
            GroupableHeaderExample frame = new GroupableHeaderExample();
            frame.addWindowListener( new WindowAdapter() {
                public void windowClosing( WindowEvent e ) {
                    System.exit(0);
            frame.setVisible(true);
    class GroupableTableHeader extends JTableHeader {
        private Vector<ColumnGroup> columnGroups = new Vector<ColumnGroup>(1, 1);
        public GroupableTableHeader(TableColumnModel model) {
            super(model);
            setUI(new GroupableTableHeaderUI());
            setReorderingAllowed(false);
        public void addColumnGroup(ColumnGroup cg) {
            if(columnGroups.size() == 0) {
                columnGroups.addElement(cg);
                return;
            int size = columnGroups.size();
            for(int i = 0; i < size; i++) {
                if(cg.getLength() > ((ColumnGroup)columnGroups.elementAt(i)).getLength())
                    columnGroups.insertElementAt(cg, i);
                else {
                    if(i == size - 1)
                        columnGroups.addElement(cg);           
        public void fitHeight() {
            int[] counter = new int[getTable().getColumnCount()];
            for(int i = 0; i < getTable().getColumnCount(); i++) {
                int level = 0;
                for(int j = 0; j < columnGroups.size(); j++) {
                    if(i >= ((ColumnGroup)columnGroups.elementAt(j)).getStartIndex() && i <= ((ColumnGroup)columnGroups.elementAt(j)).getEndIndex())
                        level = level + getNewLineCount(((ColumnGroup)columnGroups.elementAt(j)).getText());
                counter[i] = level + getNewLineCount(table.getColumnModel().getColumn(i).getHeaderValue().toString());
            int maxCounter = counter[0];
            for(int i = 0; i < counter.length; i++) {
                if(counter[i] > maxCounter)
                    maxCounter = counter;
    setPreferredSize(new Dimension(100, (maxCounter) * 20));
    public Vector getColumnGroups() {
    return columnGroups;
    public int getNewLineCount(String str) {
    BufferedReader br = new BufferedReader(new StringReader(str));
    String line;
    Vector<String> v = new Vector<String>(1, 1);
    try {           
    while((line = br.readLine()) != null) {
    v.addElement(line);
    catch(IOException ex) {
    JOptionPane.showMessageDialog(null, ex.getMessage(), "Informasi", JOptionPane.INFORMATION_MESSAGE);
    System.exit(0);
    int i = 0;
    boolean b = false;
    for(i = 0; i < v.size(); i++) {
    for(int j = 0; j < v.elementAt(i).length(); j++) {
    if(v.elementAt(i).charAt(j) != ' ') {
    b = true;
    break;
    if(b)
    break;
    if(i == v.size())
    i = 0;
    return v.size() - i;
    public void updateUI(){
    setUI(new GroupableTableHeaderUI());
    class GroupableTableHeaderUI extends BasicTableHeaderUI {     
    public void paint(Graphics g, JComponent c) {
    TableCellRenderer renderer = new MultiLineHeaderRendererEx();
    Component[] cmp = new Component[header.getColumnModel().getColumnCount()];
    Vector cg = ((GroupableTableHeader)header).getColumnGroups();
    Component[] cmpGroup = new Component[cg.size()];
    TableColumnModel tcm = header.getTable().getColumnModel();
    for(int i = 0; i < cmpGroup.length; i++) {
    cmpGroup[i] = renderer.getTableCellRendererComponent(header.getTable(), ((ColumnGroup)cg.elementAt(i)).getText(), false, false, -1, i);
    rendererPane.add(cmpGroup[i]);
    int x = 0;
    int y = 0;
    int height = 20 * ((GroupableTableHeader)header).getNewLineCount(((ColumnGroup)cg.elementAt(i)).getText());
    for(int j = 0; j < ((ColumnGroup)cg.elementAt(i)).getStartIndex(); j++)
    x += tcm.getColumn(j).getWidth();
    for(int j = 0; j < cmpGroup.length; j++) {
    if(i == j)
    continue;
    if(((ColumnGroup)cg.elementAt(i)).getStartIndex() >= ((ColumnGroup)cg.elementAt(j)).getStartIndex() && ((ColumnGroup)cg.elementAt(i)).getEndIndex() <= ((ColumnGroup)cg.elementAt(j)).getEndIndex())
    y = ((ColumnGroup)cg.elementAt(j)).getY() + ((ColumnGroup)cg.elementAt(j)).getHeight();
    ((ColumnGroup)cg.elementAt(i)).setY(y);
    ((ColumnGroup)cg.elementAt(i)).setHeight(height);
    int width = 0;
    for(int j = ((ColumnGroup)cg.elementAt(i)).getStartIndex(); j <= ((ColumnGroup)cg.elementAt(i)).getEndIndex(); j++)
    width += tcm.getColumn(j).getWidth();
    rendererPane.add(cmpGroup[i]);
    rendererPane.paintComponent(g, cmpGroup[i], header, x, y, width, height, true);
    for(int i = 0; i < cmp.length; i++) {
    cmp[i] = renderer.getTableCellRendererComponent(header.getTable(), header.getColumnModel().getColumn(i).getHeaderValue(), false, false, -1, i);
    rendererPane.add(cmp[i]);
    int x = 0;
    int y = 0;
    for(int j = 0; j < i; j++)
    x += tcm.getColumn(j).getWidth();
    for(int j = 0; j < cmpGroup.length; j++) {
    if(i >= ((ColumnGroup)cg.elementAt(j)).getStartIndex() && i <= ((ColumnGroup)cg.elementAt(j)).getEndIndex())
    y = ((ColumnGroup)cg.elementAt(j)).getY() + ((ColumnGroup)cg.elementAt(j)).getHeight();
    rendererPane.add(cmp[i]);
    rendererPane.paintComponent(g, cmp[i], header, x, y, tcm.getColumn(i).getWidth(), (header.getPreferredSize().height - y), true);
    class MultiLineHeaderRendererEx extends JList implements TableCellRenderer {
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int col) {
    if(((GroupableTableHeader)table.getTableHeader()).getNewLineCount(value.toString()) == 1) {
    JLabel header = new JLabel();
    header.setForeground(table.getTableHeader().getForeground());
    header.setBackground(table.getTableHeader().getBackground());
    header.setFont(table.getTableHeader().getFont());
    header.setHorizontalAlignment(JLabel.CENTER);
    header.setText(value.toString());
    header.setBorder(UIManager.getBorder("TableHeader.cellBorder"));
    return header;
    else {
    setOpaque(true);
    setForeground(UIManager.getColor("TableHeader.foreground"));
    setBackground(UIManager.getColor("TableHeader.background"));
    setBorder(UIManager.getBorder("TableHeader.cellBorder"));
    setFont(UIManager.getFont("TableHeader.font"));
    ListCellRenderer renderer = getCellRenderer();
    ((JLabel)renderer).setHorizontalAlignment(SwingConstants.CENTER);
    setCellRenderer(renderer);
    String str = value.toString();
    BufferedReader br = new BufferedReader(new StringReader(str));
    String line;
    Vector<String> v = new Vector<String>(1, 1);
    try {           
    while((line = br.readLine()) != null) {
    v.addElement(line);
    catch(IOException ex) {
    JOptionPane.showMessageDialog(null, ex.getMessage(), "Informasi", JOptionPane.INFORMATION_MESSAGE);
    System.exit(0);
    setListData(v);
    return this;

    OMG ! the code i posted before is incomplete
    sorry...
    here's the complete one, pls help :
    import java.io.*;
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    import javax.swing.table.*;
    import java.util.*;
    import javax.swing.border.*;
    import javax.swing.plaf.basic.*;
    public class GroupableHeaderExample extends JFrame {
        GroupableHeaderExample() {
            super("Groupable Header Example");
            JScrollPane sp = new JScrollPane();
            Object[][] data = {{"b1k1", "b1k2", "b1k3", "b1k4", "b1k5"}, {"b2k1", "b2k2", "b2k3", "b2k4", "b2k5"}};
            JTable table = new JTable(new DefaultTableModel(data, new Object[]{"Kol1", "Kol2\nmmm", "Kol3", "kol4\nmmm\nnnn", "Kol5\nmmm"})) {
                protected JTableHeader createDefaultTableHeader() {
                    return new GroupableTableHeader(columnModel);
            table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
            ColumnGroup cg = new ColumnGroup("CG", 0, 4);
            ColumnGroup cg2 = new ColumnGroup("CG2\nmmm", 1, 4);
            ColumnGroup cg3 = new ColumnGroup("CG3", 1, 2);
            ColumnGroup cg4 = new ColumnGroup("CG4", 3, 4);
            GroupableTableHeader header = (GroupableTableHeader)table.getTableHeader();
            header.addColumnGroup(cg4);
            header.addColumnGroup(cg2);
            header.addColumnGroup(cg3);
            header.addColumnGroup(cg);
            header.fitHeight();
            sp.setViewportView(table);
            getContentPane().add(sp);
            setSize(400, 300);  
        public static void main(String[] args) {
            GroupableHeaderExample frame = new GroupableHeaderExample();
            frame.addWindowListener( new WindowAdapter() {
                public void windowClosing( WindowEvent e ) {
                    System.exit(0);
            frame.setVisible(true);
    class GroupableTableHeader extends JTableHeader {
        private Vector<ColumnGroup> columnGroups = new Vector<ColumnGroup>(1, 1);
        public GroupableTableHeader(TableColumnModel model) {
            super(model);
            setUI(new GroupableTableHeaderUI());
            setReorderingAllowed(false);
        public void addColumnGroup(ColumnGroup cg) {
            if(columnGroups.size() == 0) {
                columnGroups.addElement(cg);
                return;
            int size = columnGroups.size();
            for(int i = 0; i < size; i++) {
                if(cg.getLength() > ((ColumnGroup)columnGroups.elementAt(i)).getLength()) {
                    columnGroups.insertElementAt(cg, i);
                    break;
                else {
                    if(i == size - 1)
                        columnGroups.addElement(cg);           
        public void fitHeight() {
            int[] counter = new int[getTable().getColumnCount()];
            for(int i = 0; i < getTable().getColumnCount(); i++) {
                int level = 0;
                for(int j = 0; j < columnGroups.size(); j++) {
                    if(i >= ((ColumnGroup)columnGroups.elementAt(j)).getStartIndex() && i <= ((ColumnGroup)columnGroups.elementAt(j)).getEndIndex())
                        level = level + getNewLineCount(((ColumnGroup)columnGroups.elementAt(j)).getText());
                counter[i] = level + getNewLineCount(table.getColumnModel().getColumn(i).getHeaderValue().toString());
            int maxCounter = counter[0];
            for(int i = 0; i < counter.length; i++) {
                if(counter[i] > maxCounter)
                    maxCounter = counter;
    setPreferredSize(new Dimension(100, (maxCounter) * 20));
    public Vector getColumnGroups() {
    return columnGroups;
    public int getNewLineCount(String str) {
    BufferedReader br = new BufferedReader(new StringReader(str));
    String line;
    Vector<String> v = new Vector<String>(1, 1);
    try {           
    while((line = br.readLine()) != null) {
    v.addElement(line);
    catch(IOException ex) {
    JOptionPane.showMessageDialog(null, ex.getMessage(), "Informasi", JOptionPane.INFORMATION_MESSAGE);
    System.exit(0);
    int i = 0;
    boolean b = false;
    for(i = 0; i < v.size(); i++) {
    for(int j = 0; j < v.elementAt(i).length(); j++) {
    if(v.elementAt(i).charAt(j) != ' ') {
    b = true;
    break;
    if(b)
    break;
    if(i == v.size())
    i = 0;
    return v.size() - i;
    public void updateUI(){
    setUI(new GroupableTableHeaderUI());
    class GroupableTableHeaderUI extends BasicTableHeaderUI {     
    public void paint(Graphics g, JComponent c) {
    TableCellRenderer renderer = new MultiLineHeaderRendererEx();
    Component[] cmp = new Component[header.getColumnModel().getColumnCount()];
    Vector cg = ((GroupableTableHeader)header).getColumnGroups();
    Component[] cmpGroup = new Component[cg.size()];
    TableColumnModel tcm = header.getTable().getColumnModel();
    for(int i = 0; i < cmpGroup.length; i++) {
    cmpGroup[i] = renderer.getTableCellRendererComponent(header.getTable(), ((ColumnGroup)cg.elementAt(i)).getText(), false, false, -1, i);
    int x = 0;
    int y = 0;
    int height = 20 * ((GroupableTableHeader)header).getNewLineCount(((ColumnGroup)cg.elementAt(i)).getText());
    for(int j = 0; j < ((ColumnGroup)cg.elementAt(i)).getStartIndex(); j++)
    x += tcm.getColumn(j).getWidth();
    for(int j = 0; j < cmpGroup.length; j++) {
    if(i == j)
    continue;
    if(((ColumnGroup)cg.elementAt(i)).getStartIndex() >= ((ColumnGroup)cg.elementAt(j)).getStartIndex() && ((ColumnGroup)cg.elementAt(i)).getEndIndex() <= ((ColumnGroup)cg.elementAt(j)).getEndIndex())
    y = ((ColumnGroup)cg.elementAt(j)).getY() + ((ColumnGroup)cg.elementAt(j)).getHeight();
    ((ColumnGroup)cg.elementAt(i)).setY(y);
    ((ColumnGroup)cg.elementAt(i)).setHeight(height);
    int width = 0;
    for(int j = ((ColumnGroup)cg.elementAt(i)).getStartIndex(); j <= ((ColumnGroup)cg.elementAt(i)).getEndIndex(); j++)
    width += tcm.getColumn(j).getWidth();
    rendererPane.add(cmpGroup[i]);
    rendererPane.paintComponent(g, cmpGroup[i], header, x, y, width, height, true);
    for(int i = 0; i < cmp.length; i++) {
    cmp[i] = renderer.getTableCellRendererComponent(header.getTable(), header.getColumnModel().getColumn(i).getHeaderValue(), false, false, -1, i);
    int x = 0;
    int y = 0;
    for(int j = 0; j < i; j++)
    x += tcm.getColumn(j).getWidth();
    for(int j = 0; j < cmpGroup.length; j++) {
    if(i >= ((ColumnGroup)cg.elementAt(j)).getStartIndex() && i <= ((ColumnGroup)cg.elementAt(j)).getEndIndex())
    y = ((ColumnGroup)cg.elementAt(j)).getY() + ((ColumnGroup)cg.elementAt(j)).getHeight();
    rendererPane.add(cmp[i]);
    rendererPane.paintComponent(g, cmp[i], header, x, y, tcm.getColumn(i).getWidth(), (header.getPreferredSize().height - y), true);
    class MultiLineHeaderRendererEx extends JList implements TableCellRenderer {
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int col) {
    if(((GroupableTableHeader)table.getTableHeader()).getNewLineCount(value.toString()) == 1) {
    JLabel header = new JLabel();
    header.setForeground(table.getTableHeader().getForeground());
    header.setBackground(table.getTableHeader().getBackground());
    header.setFont(table.getTableHeader().getFont());
    header.setHorizontalAlignment(JLabel.CENTER);
    header.setText(value.toString());
    header.setBorder(UIManager.getBorder("TableHeader.cellBorder"));
    return header;
    else {
    setOpaque(true);
    setForeground(UIManager.getColor("TableHeader.foreground"));
    setBackground(UIManager.getColor("TableHeader.background"));
    setBorder(UIManager.getBorder("TableHeader.cellBorder"));
    setFont(UIManager.getFont("TableHeader.font"));
    ListCellRenderer renderer = getCellRenderer();
    ((JLabel)renderer).setHorizontalAlignment(SwingConstants.CENTER);
    setCellRenderer(renderer);
    String str = value.toString();
    BufferedReader br = new BufferedReader(new StringReader(str));
    String line;
    Vector<String> v = new Vector<String>(1, 1);
    try {           
    while((line = br.readLine()) != null) {
    v.addElement(line);
    catch(IOException ex) {
    JOptionPane.showMessageDialog(null, ex.getMessage(), "Informasi", JOptionPane.INFORMATION_MESSAGE);
    System.exit(0);
    setListData(v);
    return this;
    class ColumnGroup {
    private String text;
    private int startIndex, endIndex, y, height;
    public ColumnGroup(String text, int startIndex, int endIndex) {
    this.text = text;
    this.startIndex = startIndex;
    this.endIndex = endIndex;
    public int getEndIndex() {
    return endIndex;
    public int getHeight() {
    return height;
    public int getLength() {
    return endIndex - startIndex;
    public int getStartIndex() {
    return startIndex;
    public String getText() {
    return text;
    public int getY() {
    return y;
    public void setHeight(int height) {
    this.height = height;
    public void setY(int y) {
    this.y = y;

  • JTable with custom column model and table model not showing table header

    Hello,
    I am creating a JTable with a custom table model and a custom column model. However the table header is not being displayed (yes, it is in a JScrollPane). I've shrunk the problem down into a single compileable example:
    Thanks for your help.
    import javax.swing.*;
    import javax.swing.table.*;
    public class Test1 extends JFrame
         public static void main(String args[])
              JTable table;
              TableColumnModel colModel=createTestColumnModel();
              TestTableModel tableModel=new TestTableModel();
              Test1 frame=new Test1();
              table=new JTable(tableModel, colModel);
              frame.getContentPane().add(new JScrollPane(table));
              frame.setSize(200,200);
              frame.setVisible(true);
         private static DefaultTableColumnModel createTestColumnModel()
              DefaultTableColumnModel columnModel=new DefaultTableColumnModel();
              columnModel.addColumn(new TableColumn(0));
              return columnModel;
         static class TestTableModel extends AbstractTableModel
              public int getColumnCount()
                   return 1;
              public Class<?> getColumnClass(int columnIndex)
                   return String.class;
              public String getColumnName(int column)
                   return "col";
              public int getRowCount()
                   return 1;
              public Object getValueAt(int row, int col)
                   return "test";
              public void setValueAt(Object aValue, int rowIndex, int columnIndex)
    }Edited by: 802416 on 14-Oct-2010 04:29
    added                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        

    Kleopatra wrote:
    jduprez wrote:
    See http://download.oracle.com/javase/6/docs/api/javax/swing/table/TableColumn.html#setHeaderValue(java.lang.Object)
    When the TableColumn is created, the default headerValue  is null
    So, the header ends up rendered as an empty label (probably of size 0 if the JTable computes its header size based on the renderer's preferred size).nitpicking (can't resist - the alternative is a cleanup round in some not so nice code I produced recently <g>):
    - it's not the JTable's business to compute its headers size (and it doesn't, the header's the culprit.) *> - the header should never come up with a zero (or near-to) height: even if there is no title shown, it's still needed as grab to resize/move the columns. So I would consider this sizing behaviour a bug.*
    - furthermore, the "really zero" height is a longstanding issue with MetalBorder.TableHeaderBorder (other LAFs size with the top/bottom of their default header cell border) which extends AbstractBorder incorrectly. That's easy to do because AbstractBorder itself is badly implemented
    http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6459419
    Thanks for the opportunity to have some fun :-)
    JeanetteNo problem, thanks for the insight :)

  • Custom table header renderer

    I am trying to make a custom table header. I have seen some examples on the web such as
    <mx:DataGridColumn width="150" dataField="SalePrice"
                    headerRenderer="myComponents.RendererDGHeader"/>
    where that class is a Box
    I also tried to inline it as such:
    <mx:DataGridColumn draggable="false" editable="true" headerText="Source RNC" headerStyleName="tableHeader" dataField="sourceRNC">
         <mx:headerRenderer>
              <fx:Component>
                   <mx:DataGridItemRenderer>
                        <s:Group/>    
                   </mx:DataGridItemRenderer>
                 </fx:Component>
         </mx:headerRenderer>
    </mx:DataGridColumn>
    In both these cases I get the following:
    VGroup declaration must be contained within the <Declerations>
    tag since it does not implement mx.core.IUIComponent
    Now clearly it does. Is this a bug or am I doing something
    wrong. My goal is for the table's header to have a combo
    box and a text field below the header's name to put filter
    options on the column(like hide values <5) etc
    Thanks, I know I have been posting a lot of questions lately

    By using s:MXDataGridItemRenderer, your renderer is now using Spark, and in Spark, clipping is not available by default.  You have to set clipAndEnableScrollbars=true on the layout.  Headers are asked for height if variableRowHeight=true, but not width. The width is determined by the DG columns.
    Alex Harui
    Flex SDK Developer
    Adobe Systems Inc.
    Blog: http://blogs.adobe.com/aharui

  • Custom table header

    Hi all!
    Actually it seems pretty easy but I cannot find an answer in my mind. The problem is simply controlling column widths of multiple JTables with only one table header (consider we add lots of tables with same number of columns in boxlayout (and glued to borders of same container), well handling dragging thing is relatively easy since we may override columnMoved(TableColumnModelEvent e) in JTableHeader but there is nothing like something for resizing column widths or just I cannot see). Is there a way to reach column widths(I dunno maybe some kind of array or get function)?
    do I have to create an custom Event for resizing widths?
    I'm open to any abstract ideas, well do not try to explain things as a source code(If you want you definitely can do but it's kind of burden and it's not the best way to ask for "help" also this way is better for my programming skills, just tell me function or things to extend or implement)
    Anyway, it would be pretty good to learn how to detect a change in a table's column widths(which event, etc...)
    thanks for your helps:))

    to be more precise if there is someone just like me, lookin for this:
    package ComponentDisplayer;
    import java.awt.*;
    import javax.swing.*;
    import javax.swing.table.*;
    public class TableColumnTest extends JFrame
         public TableColumnTest()
              JTable north = new JTable(5, 10);
              //north.setPreferredScrollableViewportSize(north.getPreferredSize());
              JTable south = new JTable(5, 10);
              //south.setPreferredScrollableViewportSize(south.getPreferredSize());
              south.setColumnModel( north.getColumnModel() );
              south.setTableHeader(north.getTableHeader());
              JPanel jp=new JPanel();
              jp.setLayout(new BoxLayout(jp, BoxLayout.PAGE_AXIS));
              jp.add(north.getTableHeader());
              jp.add(north);
              jp.add(south);
              jp.remove(north);
              /*JScrollPane spsouth=new JScrollPane(south);
              spsouth.setSize(south.getColumnModel().getTotalColumnWidth(),south.getRowCount()*south.getRowHeight());
              spsouth.setMaximumSize(new Dimension(south.getColumnModel().getTotalColumnWidth(),south.getRowCount()*south.getRowHeight()));
              JScrollPane spnorth=new JScrollPane(north);
              spnorth.setSize(north.getColumnModel().getTotalColumnWidth(),north.getRowCount()*north.getRowHeight());
              spnorth.setMaximumSize(new Dimension(north.getColumnModel().getTotalColumnWidth(),north.getRowCount()*north.getRowHeight()));
              jp.add( spnorth);
              jp.add( spsouth);
              north.setValueAt(new String("north"), 0, 0);
              south.setValueAt(new String("south"), 0, 0);
              getContentPane().add(jp);
         public static void main(String[] args)
              TableColumnTest frame = new TableColumnTest();
              frame.setDefaultCloseOperation( EXIT_ON_CLOSE );
              frame.pack();
              frame.setLocationRelativeTo( null );
              frame.setVisible(true);
    }

  • Add custom fields in header of FI documents using FI_HEADER_SUB_1300IM

    Hi
    We are trying to add a couple of custom fields in header area of FB01 by making a copy of badi FI_HEADER_SUB_1300IM. With this method we are facing a couple of problems
    - The custom fields added in bkpf structure,  only appears in FB01 just in the case we have go before to FB03 or FB02.
    - We don´t reach to save data of these fields in table BKPF.
    can anybody help us with these problems?
    thanks in advance for your help
    I leave here the code we have used in the copy of badi FI_HEADER_SUB_1300IM
    MODULE d1300_pbo OUTPUT.
      IF exit IS INITIAL.
        CALL METHOD cl_exithandler=>get_instance_for_subscreens
          CHANGING
            instance                      = exit
           EXCEPTIONS
    *      NO_REFERENCE                  = 1
    *      NO_INTERFACE_REFERENCE        = 2
    *      NO_EXIT_INTERFACE             = 3
    *      DATA_INCONS_IN_EXIT_MANAGEM   = 4
    *      CLASS_NOT_IMPLEMENT_INTERFACE = 5
             OTHERS                        = 6.
        IF sy-subrc <> 0.
    *   MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
    *              WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
        ENDIF.
      ENDIF.
      CALL METHOD exit->get_data_from_screen_pbo
        EXPORTING
          FLT_VAL       = 'ES'
        IMPORTING
          ex_bkpf       = g_bkpf
          ex_x_no_input = g_no_input.
      loop at screen.
       if g_no_input = 'X'.
         screen-input = 0.
         modify screen.
       endif.
      endloop.
    ENDMODULE.   
    **************************+
    FORM put_value .
    * import header data from main screen
      call method exit->get_data_from_screen_pai
        EXPORTING
          FLT_VAL  = 'ES'
        importing
          ex_bkpf  = g_bkpf.
    * set reference fields
    g_bkpf-ZZDPTOAPROBADOR = bkpf-ZZDPTOAPROBADOR.
    g_bkpf-ZZDELAPROBADOR = bkpf-ZZDELAPROBADOR.
    * put data to main screen
      call method exit->put_data_to_screen_pai
        exporting
          im_bkpf  = g_bkpf
          flt_val  = 'ES'.
    ENDFORM.
    Added code tags
    Edited by: Rob Burbank on May 10, 2011 12:17 PM

    SriVarma,
    Cool! I didn't know this BADI!
    Playing around with existing implementations I can see that, BADI_SD_TAB_CUST_H, can definitely enhance the Sales order header with additional tab strip screens. Similarly BADI_SD_TAB_CUST_I can be used to enhance Sales order item screens.
    Here is what I understand from the coding of an existing implementation
    ACTIVATE_TAB_PAGE - takes a module pool program name and a subscreen that you created and adds it as a additional tab page to sales order header screen. You need to pass back f_program and f_dynpro with your program and screen number that you painted
    TRANSFER_DATA_TO_SUBSCREEN - can be used to read and pass data to the fields on the subscreen you created
    TRANSFER_DATA_FROM_SUBSCREEN - can be used to pass back whatever changes done by user to the respective Z variables in VBAK
    PASS_FCODE_TO_SUBSCREEN - Pass the fcode the user selected to your subscreen.
    I would suggest that you create a function group and create screens, functions etc within that and use those in these methods. Refer existing implementations. The global data of the function group can then be used to communicate between all the above methods

  • Button not working in a table header

    I have a custom view that implements table header. I have buttons in that view. The buttons used to work fine in SDK prior to 5. I moved directly to SDK 7, and the buttons stopped working. The action is not called anymore.
    Any help will be appreciated.
    Thanks

    Well, you have me stumped. I just replicated your code and it works fine for me:
    - (void)doStuff:(id)sender
    NSLog(@"Logo Touched!");
    - (void)viewDidLoad {
    // loadingView is a UIView that becomes the tableHeaderView
    self.tableView.tableHeaderView = loadingView;
    [loadingActivity startAnimating];
    // setup a sample button (declared in header)
    logoButton = [[UIButton alloc] initWithFrame:CGRectZero];
    [logoButton setImage:[UIImage imageNamed:@"logo_webclip.png"] forState:UIControlStateNormal];
    [logoButton addTarget:self action:@selector(doStuff:) forControlEvents:UIControlEventTouchUpInside];
    logoButton.tag = 100;
    [loadingView addSubview:logoButton];
    - (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    logoButton.frame = CGRectMake(50., 50., 64., 64.);
    That calls my target everytime it's touched... are you remembering to call the superclass for each of your overrided methods in your custom UIView? The only difference between my quick test and yours is that I didn't subclass UIView -- I just used the UIView class directly.

  • Vertical text in table heading

    Hi,
    I would like to save some space in some reports and I would like to change orientation of text in table heading.
    Is it posible to have vertical text in table heading?
    What I want is showed on this picture: [Vertical text|¨http://img179.imageshack.us/img179/234/obiverticaltext.jpg]
    Thank you for some tips.

    Hi,
    Go through this...will help you solve your requirement....http://blog.trivadis.com/blogs/andreasnobbmann/archive/2009/07/17/vertical-text-in-obiee.aspx
    Use the same code Writing-mode: tb-rl; filter: flipv fliph; in custom css style of column heading.(column properties->column format->edit format icon beside column heading->css style)
    Regards,
    Srikanth

  • Change documents for customer Z table - serious help wanted

    Hi all,
    I am no beginner and I don't expect any comments from beginners.
    Situation: My customer wants to replace the material valuation transactions MRN1 MRN2 MRN3 due to bad performance and locking problems with own developed programs.
    The valuation results will be stored in a customer Z-Table on a monthly base. For auditing and transparency purposes, this Z-table has to get a change object and the update routines will have to write change documents.
    Due to the expected size of the new Z-table, it is not advisable to simply switsch on table logging.
    In this huge project (and in none I participated!) nobody ever implemented the change document process for a Z-table. <b>BUT EVERYBODY CAN TELL YOU THI IS NO PROBLEM AT ALL.</b>
    I read some documentation at SAP and serached for threads or blogs here. I could not find anything desribing that in depth.
    So before I start, I'd be happy to get some hints from people who created own change documents and implemented the process. Links to documentation and other helpful pages are also welcome.
    If I can keep the process simple, I'd like to create a BLOG on this - because I think, in the future it will get more and more difficult to pass the auditing process with undocumented features and uncontrolled table changes.
    TIA.
    Regards,
    Clemens

    Hi,
    Please check this thread.
    http://www.sapdevelopment.co.uk/tips/changedoc/cd_createch.htm
    Once you create your change document object using generate update pgm option then  please check the WRITE document fm.
    I have done this long back i am updating CDHDR and CDPOS for 2 table YATT and YATTPLANTS. Here YATT have single record (header table) and YATTPLANTS have multiple records (item table)
    function yatt_write_document           .
      call function 'CHANGEDOCUMENT_OPEN'
        exporting
          objectclass             = 'YATT           '
          objectid                = objectid
          planned_change_number   = planned_change_number
          planned_or_real_changes = planned_or_real_changes
        exceptions
          sequence_invalid        = 1
          others                  = 2.
      case sy-subrc.
        when 0.                                   "ok.
        when 1. message a600 with 'SEQUENCE INVALID'.
        when 2. message a600 with 'OPEN ERROR'.
      endcase.
    if upd_yctc                           ne space.
       call function 'CHANGEDOCUMENT_SINGLE_CASE'
         exporting
           tablename              = 'YATT                          '
           workarea_old           = o_yatt
           workarea_new           = n_yatt
            change_indicator       = upd_yattc
            docu_delete            = 'X'
         exceptions
           nametab_error          = 1
           open_missing           = 2
           position_insert_failed = 3
           others                 = 4.
        case sy-subrc.
          when 0.                                "ok.
          when 1. message a600 with 'NAMETAB-ERROR'.
          when 2. message a600 with 'OPEN MISSING'.
          when 3. message a600 with 'INSERT ERROR'.
          when 4. message a600 with 'SINGLE ERROR'.
        endcase.
      endif.
      if upd_yctcauthplnts                  ne space.
        call function 'CHANGEDOCUMENT_MULTIPLE_CASE'
          exporting
            tablename              = 'YATTPLANTS                 '
            change_indicator       = upd_yattplants
            docu_delete            = 'X'
          tables
            table_old              = yyattplants
            table_new              = xyattplants
         exceptions
           nametab_error          = 1
           open_missing           = 2
           position_insert_failed = 3
           others                 = 4.
        case sy-subrc.
          when 0.                                "ok.
          when 1. message a600 with 'NAMETAB-ERROR'.
          when 2. message a600 with 'OPEN MISSING'.
          when 3. message a600 with 'INSERT ERROR'.
          when 4. message a600 with 'MULTIPLE ERROR'.
        endcase.
      endif.
      call function 'CHANGEDOCUMENT_CLOSE'
        exporting
          objectclass             = 'YATT           '
          objectid                = objectid
          date_of_change          = udate
          time_of_change          = utime
          tcode                   = tcode
          username                = username
          object_change_indicator = object_change_indicator
          no_change_pointers      = no_change_pointers
        exceptions
          header_insert_failed    = 1
          object_invalid          = 2
          open_missing            = 3
          no_position_inserted    = 4
          others                  = 5.
      case sy-subrc.
        when 0.                                   "ok.
        when 1. message a600 with 'INSERT HEADER FAILED'.
        when 2. message a600 with 'OBJECT INVALID'.
        when 3. message a600 with 'OPEN MISSING'.
    *    WHEN 4. MESSAGE A600 WITH 'NO_POSITION_INSERTED'.
    * do not abort, if positions are not inserted!!!
        when 5. message a600 with 'CLOSE ERROR'.
      endcase.
    endfunction.

  • How to set the font of a table header?

    Hi,
    Is there a way to set the font of a table header? I do not mean how to change the header word but the font.
    Thanks
    Stephen

    Hi,
    for combobox in a table (I assume the combobox is shown un column 2, thus the index 1)
    oracle.jbo.uicli.jui.JUTableLOVEditor lovCellEditor = (oracle.jbo.uicli.jui.JUTableLOVEditor) jTable1.getColumnModel().getColumn(1).getCellEditor();
    lovCellEditor.getComponent().setFont(new Font("Arial",Font.BOLD,13));
    For the LOV panel this is a bit more complicated because you need to create a custom LOV panel as described in http://www.oracle.com/technology/products/jdev/howtos/10g/jclientlov/customadfjclientlovpanel.html
    I filed a bug today to expose the component on a LOV to public so they can be modified
    Frank

  • Dynamic Table Header in WebI

    Hi community
    I'm currently facing quite a challange with WebI:
    I have (simplified) the following data structure in my Universe (which ist built upon a BEx Query):
    - Customer
    - Calendar Day
    - Calendar Week
    - Calendar Month
    - Turnover
    Now, the customer want's to a have cross-tab like this one:
    June 2010
    July 2010
    August 2010
    Customer 1
    324'324
    847'342
    543'534
    Customer 2
    567'456
    249'143
    579'134
    The challange is: The customer wants to select the data by a list of customers (that's easy) and one of the three time dimensions (would be easy too). BUT: Depending on the time dimension the user selects, the cross-tab's table header should change to that dimension! So, when the user enters "july 2010 - august 2010" the table's header shows the months like in my example above. When he leaves the month blank in the prompt and restricts calendar week to "03.2010 - 07.2010", the table's header should show the corresponding weeks, not months!
    Has anyone an idea how to accomplish this?
    Restriction: I don't want the user to have to "drag & drop" the dimensions from and into the table. The report should not be editable.
    Thank you trying to help me!
    phil

    Capture the User selection using UserResponse() function.
    Eg: Prompt on Month: Select Month == Jan2010 (User Selected)
    In Table headers: write formula like this:
    |=UserResponse(Select Month) | =UserResponse(Select Month)-1 | =UserResponse(Select Month)-2 etc...,
    Seems you have Prompts for both Month and Week as well, follow the same.
    Hope it helps you.
    Thank You!
    H2H

  • Add a Button in a table header Webdynpro

    Hi all,
    how can'i add a button in a table header ? and how/where schould be implemented?
    thank you all

    Hi,
    If you want to create Some custom buttons in ALV, you need to write some coding.
    Please go through this...
    ALV with user-defined buttons on toolbar in wd abap
    Re: Adding custom button in standard toolbar in ALV
    If you want to create button is table toolbar. steps :
    1. create TABLE UI Element in view - go to ROOT UI ELEMENT CONTAINER( right side here you find inserted Table ) - Right click on that ->you fined one option INSERT TOOLBAR, click this-> it will insert Toolbar again right click on this tool bar-> You wil find insert
    toolbar element->select Toolbar button. It will insert toolbar and buttons.
    Cheers,
    Kris.

  • XP Table Header on 1.4.2_06

    Hi there
    I have a JTable with five columns. On the first two columns, I have made custom renderers to show a picture in the table header. The rest of the columns are normal.
    There is a screenshot of what I mean at the site below.
    http://www.geocities.com/rezrovs/tableheader.JPG
    Please could someone tell me how to get the border that is applied to these normal columns so that I can apply the border to the custom headers.
    Many thanks,
    Rachel

    Have you tried something like:
    public Component getTableCellRendererComponent(javax.swing.JTable table,
                                                             Object  value,
                                                             boolean isSelected,
                                                             boolean hasFocus,
                                                             int     row,
                                                             int     column) {
         Component comp = super.getTableCellRendererComponent(table, value, isSelected,
                                                                 hasFocus, row, column);
         if (comp != null && comp instanceof JLabel) {
              JLabel returnLabel = (JLabel)comp;
              ImageIcon icon = null;
              int hAlign = returnLabel.getHorizontalAlignment();
              String text = null;
              switch(column){
                   case(0): { icon = Utils.GRIDPRIORITYICON; hAlign = JLabel.CENTER; break; }
                   case(1): { icon = Utils.GRIDATTACHICON;   hAlign = JLabel.CENTER; break; }
                   default:  { text = (value == null) ? "" : value.toString();  }
                    if (icon != null) returnLabel.setIcon(icon);
                    if (text != null) returnLabel.setText(text);
                    returnLabel.setHorizontalAlignment(hAlign);
            return comp;
    }

  • Table header cell dividers

    Is there a way to have to make the cells divider lines in a table header be a custom thickness. with different thicknesses on different pages. I am thinking there is no way to do this inside of FM 8. And would that be changed in the read and write or the dtd.

    Hi Frank,
    There's a somewhat more complicated way that has some advantage if you don't mind the work. This solution is to place PDF images of the titles in the header cells as Background Fill Images. The main advantage over a grouped text box is that the background fill image will track the particular cell exactly, even if rows and columns are added or deleted or resized, including the one that the image is in.
    Start with your title in a text box that "just fits".
    Click off the box and then click once back on the box, such that the handles are showing but the text is not selected.
    Command-C
    Switch to Preview.app and Command-N. You now have converted your title to a PDF.
    Still in Preview, Command-C to copy the PDF
    Switch to Pages, Select the Cell, Command-V to set the PDF into the background.
    Set the justification to centered, both vertically and horizontally for the best tracking.
    As far as the rotation goes, you can rotate the Text Box before you convert it, or you can rotate the PDF before inserting into the cell. It doesn't matter.
    Regards,
    Jerry

  • Clicking on table header throws exception

    I'm using Windows Look and Feel. I made a table and applied the custom renderer to the table header. When I click the table header it throws a NullPointerException relating to the plaf.
    javax.swing.plaf.basic.BasicTableHeaderUI$MouseInputHandler.mouseClicked(Unknown Source)+
    Anybody any Idea. Adding the mouse Listener solves this problem but I dont want to use the listeners just for that reason.

    Take a look here:
    http://www.codeguru.com/java/articles/218.shtml

Maybe you are looking for