如何将水平滚动窗格中组件的垂直尺寸限制为滚动窗格的垂直尺寸?
GUI应该总是这样:
这是滚动水平滚动条后得到的结果:
相关代码段:创建框架,添加传感器列。也是在早些时候用BoxLayout尝试过这个问题。
frame = new JFrame();
frame.setBounds(100, 100, 764, 494);
GridBagLayout gridBagLayout = new GridBagLayout();
gridBagLayout.columnWidths = new int[]{500, 500};
gridBagLayout.rowHeights = new int[] {439,45};
gridBagLayout.columnWeights = new double[]{1.0, 1.0};
gridBagLayout.rowWeights = new double[]{1.0, 0.0};
frame.getContentPane().setLayout(gridBagLayout);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
frame.setTitle("CSV Builder -- Development Version StackOverflow Example");
//Panel for holding the text areas for each sensor
JPanel sensorPanel = new JPanel();
GridBagLayout sensorGridBagLayout = new GridBagLayout();
sensorGridBagLayout.rowHeights = new int[] {40,40,39};
sensorGridBagLayout.rowWeights = new double[]{0.0,1.0, 0.0};
sensorPanel.setLayout(sensorGridBagLayout);
//Scroll pane on horizontal box
JScrollPane scrollPane = new JScrollPane(sensorPanel);
scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER);
scrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS);
GridBagConstraints gbc_scrollPane = new GridBagConstraints();
gbc_scrollPane.insets = new Insets(0, 0, 5, 5);
gbc_scrollPane.fill = GridBagConstraints.BOTH;
gbc_scrollPane.gridx = 0;
gbc_scrollPane.gridy = 0;
frame.getContentPane().add(scrollPane, gbc_scrollPane);
//Set up text areas for each sensor
for(int k = 0; k < EngineDataParser.titles.length; k++){
//Make Label
JLabel lblEngineTemperature = new JLabel(EngineDataParser.titles[k]);
GridBagConstraints gbc_lblEngineTemperature = new GridBagConstraints();
gbc_lblEngineTemperature.insets = new Insets(0, 0, 5, 5);
gbc_lblEngineTemperature.gridx = k;
gbc_lblEngineTemperature.gridy = 1;
gbc_lblEngineTemperature.anchor = GridBagConstraints.NORTH;
//Make text area
JTextArea sensorTextArea = new JTextArea();
sensorTextArea.setLineWrap(false);
sensorTextArea.setText("No Data Yet");
sensorTextArea.setBounds(50,50,50,200);
GridBagConstraints gbc_sensorTextArea = new GridBagConstraints();
gbc_sensorTextArea.insets = new Insets(0, 0, 5, 5);
//Add scroll pane
JScrollPane sensorScrollPane = new JScrollPane(sensorTextArea);
sensorScrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
sensorScrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
sensorScrollPane.setBounds(50,50,50,200);
GridBagConstraints gbc_sensorScrollPane = new GridBagConstraints();
gbc_sensorScrollPane.insets = new Insets(0, 0, 5, 5);
gbc_sensorScrollPane.fill = GridBagConstraints.BOTH;
gbc_scrollPane.gridx = k;
gbc_scrollPane.gridy = 2;
gbc_scrollPane.weightx = 1.0;
gbc_scrollPane.weighty = 1.0;
gbc_scrollPane.anchor = GridBagConstraints.CENTER;
//make checkbox
JCheckBox exportCheckBox = new JCheckBox("Export "+EngineDataParser.titles[k]);
GridBagConstraints gbc_exportCheckBox = new GridBagConstraints();
exportCheckBox.addActionListener(checkboxListener);
gbc_exportCheckBox.insets = new Insets(0, 0, 5, 5);
gbc_exportCheckBox.gridx = k;
gbc_exportCheckBox.gridy = 3;
gbc_exportCheckBox.anchor = GridBagConstraints.SOUTH;
//add all to panel
sensorPanel.add(lblEngineTemperature, gbc_lblEngineTemperature);
sensorPanel.add(sensorScrollPane, gbc_sensorScrollPane);
sensorPanel.add(exportCheckBox, gbc_exportCheckBox);
//add all to arrays for later adjusting
sensorLabels.add(lblEngineTemperature);
sensorTextAreas.add(sensorTextArea);
sensorCheckBoxes.add(exportCheckBox);
}
**********这是主要的想法,丰富的细节和可运行的代码如果它有帮助**********
背景:我正在为引擎测试系统制作GUI。我在带有水平滚动条的JScrollPane中有一个带GridBagLayout的JPanel。在面板的每一列中,都有一个标题,文本区域,其中滚动窗格包含一列传感器数据,还有一个复选框,询问用户是否要导出该列数据。
意图:当用户加载文件时,它将从引擎日志中读取数据,将每个传感器分离到JPanel中的单独列,并在按下导出按钮时导出任何已检查的列。
什么工作:所有后端文件处理/分离都有效。
问题:加载文件并移动水平滚动条后,文本区域会垂直变大并延伸到水平JScrollPane下方。
我已尝试使用GridBagLayout和BoxLayout来解决此问题。盒子布局首先看起来正确,但在水平滚动时显示相同的有害行为。
GridBagLayout也总是尝试将JTextArea添加到顶行。不知道为什么。
我考虑在JTextAreas上使用setMaximumSize(),但是如果用户调整整个窗口的大小,这可能会使它们太小(这就是我无论如何都要打扰布局管理器的全部原因。否则,对于这个小的我刚刚使用绝对布局的程序)
完整代码,主GUI: 这是代码:
package engineSensorReader;
import java.awt.Color;
public class CSVBuilder {
/*Creates a GUI that builds a CSV file from an file of raw serial output from a sensor array
* Each line of the unprocessed file looks like so
* <TEMP1:123,TEMP2:122,TEMP3:124,GLAT:1138, ... PONT:1,>
* Each file has a different set of sensors
* The program puts each sensor in a separate column with a check box beneath it
* If the user leaves the box checked, that column is written to a CSV file the user exports
*/
//Globally accessible GUI components
private JFrame frame;
JTextArea engineTemperatureTextArea = new JTextArea();
JButton loadFileButton = new JButton("Load File");
JFileChooser fileFinder = new JFileChooser();
JButton exportFileButton = new JButton("Export File");
//Lists of components pertaining to each sensor
private List<JLabel> sensorLabels = new ArrayList<JLabel>();
private List<JTextArea> sensorTextAreas = new ArrayList<JTextArea>();
private List<JCheckBox> sensorCheckBoxes = new ArrayList<JCheckBox>();
//Text are for raw file
private JTextArea rawFileTextArea = new JTextArea();
private JScrollPane rawFileScrollPane = new JScrollPane();
//instantiate custom data parser object
EngineDataParser dataParser = new EngineDataParser();
//array of booleans tells us if we want a certain sensor in the output file
private boolean[] exportSensorChecks = new boolean[EngineDataParser.titles.length];
private boolean fileIsImported = false;
private Color greenish = new Color(196,250,185);
private Color reddish = new Color(250,199,185);
public static void main(String[] args){
CSVBuilder mCSVBuilder = new CSVBuilder();
}
public JFrame getFrame() {
return frame;
}
public CSVBuilder() {
initialize();
}
void initialize() {
frame = new JFrame();
frame.setBounds(100, 100, 764, 494);
GridBagLayout gridBagLayout = new GridBagLayout();
gridBagLayout.columnWidths = new int[]{500, 500};
gridBagLayout.rowHeights = new int[] {439,45};
gridBagLayout.columnWeights = new double[]{1.0, 1.0};
gridBagLayout.rowWeights = new double[]{1.0, 0.0};
frame.getContentPane().setLayout(gridBagLayout);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Image mainIcon = new ImageIcon(this.getClass().getResource("/hat.png")).getImage();
frame.setIconImage(mainIcon);
frame.setVisible(true);
frame.setTitle("CSV Builder -- Development Version StackOverflow Example");
//Panel for holding the text areas for each sensor
JPanel sensorPanel = new JPanel();
GridBagLayout sensorGridBagLayout = new GridBagLayout();
sensorGridBagLayout.rowHeights = new int[] {40,40,39};
sensorGridBagLayout.rowWeights = new double[]{0.0,1.0, 0.0};
sensorPanel.setLayout(sensorGridBagLayout);
//Scroll pane on horizontal box
JScrollPane scrollPane = new JScrollPane(sensorPanel);
scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER);
scrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS);
GridBagConstraints gbc_scrollPane = new GridBagConstraints();
gbc_scrollPane.insets = new Insets(0, 0, 5, 5);
gbc_scrollPane.fill = GridBagConstraints.BOTH;
gbc_scrollPane.gridx = 0;
gbc_scrollPane.gridy = 0;
frame.getContentPane().add(scrollPane, gbc_scrollPane);
//Set up text areas for each sensor
for(int k = 0; k < EngineDataParser.titles.length; k++){
//Make Label
JLabel lblEngineTemperature = new JLabel(EngineDataParser.titles[k]);
GridBagConstraints gbc_lblEngineTemperature = new GridBagConstraints();
gbc_lblEngineTemperature.insets = new Insets(0, 0, 5, 5);
gbc_lblEngineTemperature.gridx = k;
gbc_lblEngineTemperature.gridy = 1;
gbc_lblEngineTemperature.anchor = GridBagConstraints.NORTH;
//Make text area
JTextArea sensorTextArea = new JTextArea();
sensorTextArea.setLineWrap(false);
sensorTextArea.setText("No Data Yet");
sensorTextArea.setBounds(50,50,50,200);
GridBagConstraints gbc_sensorTextArea = new GridBagConstraints();
gbc_sensorTextArea.insets = new Insets(0, 0, 5, 5);
//Add scroll pane
JScrollPane sensorScrollPane = new JScrollPane(sensorTextArea);
sensorScrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
sensorScrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
sensorScrollPane.setBounds(50,50,50,200);
GridBagConstraints gbc_sensorScrollPane = new GridBagConstraints();
gbc_sensorScrollPane.insets = new Insets(0, 0, 5, 5);
gbc_sensorScrollPane.fill = GridBagConstraints.BOTH;
gbc_scrollPane.gridx = k;
gbc_scrollPane.gridy = 2;
gbc_scrollPane.weightx = 1.0;
gbc_scrollPane.weighty = 1.0;
gbc_scrollPane.anchor = GridBagConstraints.CENTER;
//make checkbox
JCheckBox exportCheckBox = new JCheckBox("Export "+EngineDataParser.titles[k]);
GridBagConstraints gbc_exportCheckBox = new GridBagConstraints();
exportCheckBox.addActionListener(checkboxListener);
gbc_exportCheckBox.insets = new Insets(0, 0, 5, 5);
gbc_exportCheckBox.gridx = k;
gbc_exportCheckBox.gridy = 3;
gbc_exportCheckBox.anchor = GridBagConstraints.SOUTH;
//add all to panel
sensorPanel.add(lblEngineTemperature, gbc_lblEngineTemperature);
sensorPanel.add(sensorScrollPane, gbc_sensorScrollPane);
sensorPanel.add(exportCheckBox, gbc_exportCheckBox);
//add all to arrays for later adjusting
sensorLabels.add(lblEngineTemperature);
sensorTextAreas.add(sensorTextArea);
sensorCheckBoxes.add(exportCheckBox);
}
Box buttonBox = Box.createHorizontalBox();
GridBagConstraints gbc_buttonBox = new GridBagConstraints();
gbc_buttonBox.gridx = 1;
gbc_buttonBox.gridy = 1;
gbc_buttonBox.anchor = GridBagConstraints.EAST;
frame.getContentPane().add(buttonBox, gbc_buttonBox);
rawFileTextArea = new JTextArea();
rawFileTextArea.setText("No file selected yet");
rawFileTextArea.setBounds(50,50,300,400);
rawFileScrollPane = new JScrollPane(rawFileTextArea);
rawFileScrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
rawFileScrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
JLabel rawFileLabel = new JLabel("Raw File Contents");
Box rawFileBox = Box.createVerticalBox();
rawFileBox.add(rawFileLabel);
rawFileBox.add(rawFileScrollPane);
GridBagConstraints gbc_rawFileBox = new GridBagConstraints();
gbc_rawFileBox.gridx = 1;
gbc_rawFileBox.gridy = 0;
gbc_rawFileBox.anchor = GridBagConstraints.WEST;
gbc_rawFileBox.fill = GridBagConstraints.BOTH;
gbc_rawFileBox.insets = new Insets(0, 0, 5, 5);
frame.getContentPane().add(rawFileBox, gbc_rawFileBox);
loadFileButton.addActionListener(manipulateFileListener);
buttonBox.add(loadFileButton);
exportFileButton.addActionListener(manipulateFileListener);
buttonBox.add(exportFileButton);
frame.pack();
frame.setVisible(true);
}
//Reads raw serial file to text areas
private void readFileToBoxes(File importedFile) throws IOException{
try{
FileReader importReader = new FileReader(importedFile);
BufferedReader readFileReader = new BufferedReader(importReader);
StringBuilder fileContents = new StringBuilder((int)importedFile.length());
Scanner scanner = new Scanner(importedFile);
String lineSeparator = System.getProperty("line.separator");
String currentSensorReading;
String readLineString;
try {
while(scanner.hasNextLine()) {
readLineString = scanner.nextLine();
rawFileTextArea.append(readLineString +"\n");
dataParser.interpret(readLineString);
if(dataParser.readyToOutput){
int newNumber = 0;
for(int h = 0; h<EngineDataParser.titles.length;h++){
if(fileIsImported == false){ //Check if this is first run through
sensorTextAreas.get(h).setText("");
}
currentSensorReading = EngineDataParser.getLastNumericalReadings()[h];
if(currentSensorReading!=null){
sensorTextAreas.get(h).append(currentSensorReading+"\n");
sensorTextAreas.get(h).setBackground(greenish);
sensorCheckBoxes.get(h).setSelected(true);
exportSensorChecks[h] = true;
}else{
System.out.println("no data," + EngineDataParser.titles[h] + "iterator: "+ h);
sensorTextAreas.get(h).append(currentSensorReading+"\n");
sensorTextAreas.get(h).setBackground(reddish);
sensorCheckBoxes.get(h).setSelected(false);
exportSensorChecks[h] = false;
}
}
fileIsImported = true;
}
}
} finally {
scanner.close();
}
}catch(FileNotFoundException didNotFindFile){
didNotFindFile.printStackTrace();
engineTemperatureTextArea.setText("File chosen but not found");
}
}
//Writes appropriate columns to CSV file
private void saveFileToCSV(File fileToSave){
String dataLine = "";
try {
PrintWriter writeToCSVWriter = new PrintWriter(fileToSave);
for(int sensor = 0; sensor <EngineDataParser.titles.length; sensor++){
if(exportSensorChecks[sensor] == true){
writeToCSVWriter.print(EngineDataParser.titles[sensor]);
writeToCSVWriter.print(",");
}
}
for(int dataPoint = 0; dataPoint <= dataParser.getWriteToIndex(); dataPoint++){
dataLine = "";
for(int sensor = 0; sensor <EngineDataParser.titles.length; sensor++){
if(exportSensorChecks[sensor] == true){
System.out.println("To here, printing data point");
dataLine += dataParser.getAssignedDataPoint(sensor, dataPoint) + ",";
}
}
writeToCSVWriter.println(dataLine);
}
writeToCSVWriter.close();
} catch (IOException e) {
e.printStackTrace();
}
}
//Check box listener handles...well, checkboxes and coloring text areas
ActionListener checkboxListener = new ActionListener(){
public void actionPerformed(ActionEvent boxChecked){
for(int boxIndex = 0; boxIndex < EngineDataParser.titles.length; boxIndex ++){
if(boxChecked.getSource() == sensorCheckBoxes.get(boxIndex)){
if(sensorCheckBoxes.get(boxIndex).isSelected()){
exportSensorChecks[boxIndex] = true;
sensorTextAreas.get(boxIndex).setBackground(greenish);
}else{
exportSensorChecks[boxIndex] = false;
sensorTextAreas.get(boxIndex).setBackground(reddish);
}
}
}
}
};
//Action listener handles file importing and exporting
ActionListener manipulateFileListener = new ActionListener(){
public void actionPerformed(ActionEvent e){
if(e.getSource() == loadFileButton){
int whatHappens = fileFinder.showOpenDialog(frame);
if(whatHappens == JFileChooser.APPROVE_OPTION){
File importedFile = fileFinder.getSelectedFile();
try{
readFileToBoxes(importedFile);
}catch(IOException didNotFindFile){
didNotFindFile.printStackTrace();
engineTemperatureTextArea.setText("File chosen but something else failed");
}
engineTemperatureTextArea.setText("We chose the file: " + importedFile.getName());
}else{
engineTemperatureTextArea.setText("We somehow failed to choose a file");
}
}else if(e.getSource() == exportFileButton){
int whatHappens = fileFinder.showSaveDialog(frame);
if(whatHappens == JFileChooser.APPROVE_OPTION){
File exportFile = fileFinder.getSelectedFile();
saveFileToCSV(exportFile);
engineTemperatureTextArea.setText("We exported the file: " + exportFile.getName());
if(exportFile.getName().indexOf(".csv") < 0 && exportFile.getName().indexOf(".txt") < 0){
JOptionPane.showMessageDialog(frame, "Unrecognized file extension or no extension used. Consider re-saving as .txt (for using CSV builder) or .csv (for easier use with spreadsheet)");
}
}else{
engineTemperatureTextArea.setText("We somehow failed to choose a file");
}
}
}
};
数据分析类
package engineSensorReader;
import java.awt.List;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
public class EngineDataParser implements Runnable {
static boolean readyToOutput = false; //shows we have data ready to update a GUI or whatever
static boolean enableFileWrite = false; //will be set to true if we want to log this data to a file
static boolean listsOfPointsCreated = false; //tells us we need to make titles and all
//Arraylists for each sensor reading. We won't always have all of them but that's alright
ArrayList<String> engineTemperatures = new ArrayList<String>();
ArrayList<String> transmissionTemperatures = new ArrayList<String>();
ArrayList<String> ambientTemperatures = new ArrayList<String>();
ArrayList<String> auxiliaryTemperatures = new ArrayList<String>();
ArrayList<String> engineRPMs = new ArrayList<String>();
ArrayList<String> cVTDrivenRPMs = new ArrayList<String>();
ArrayList<String> gPSLatitudes = new ArrayList<String>();
ArrayList<String> gPSLongitudes = new ArrayList<String>();
ArrayList<String> gPSAltitudes = new ArrayList<String>();
ArrayList<String> gPSFixes = new ArrayList<String>();
ArrayList<String> fuelLevels = new ArrayList<String>();
ArrayList<String> throttlePositions = new ArrayList<String>();
ArrayList<String> pointCounts = new ArrayList<String>();
ArrayList<String> auxiliarySensor1Readings = new ArrayList<String>();
ArrayList<String> auxiliarySensor2Readings = new ArrayList<String>();
ArrayList<String> auxiliarySensor3Readings = new ArrayList<String>();
ArrayList<ArrayList<String>> allDataArray = new ArrayList<ArrayList<String>>();
private int writeToIndex = 0;
//String ArrayList of titles for each
static String[] titles = {"Transmission Temperature","Engine Temperature","Ambient Temperature","Auxiliary Temperature","Engine RPM","CVT Driven RPM","GPS Latitidue (Decimal Degrees)","GPS Longitude (Decimal Degrees)","GPS Altitude","GPS Fix (1 or 0)","Fuel Level","Throttle Position","Point Count","Auxilary Sensor 1","Auxilary Sensor 2","Auxilary Sensor 3"};
private static volatile String[] lastNumericalReadings = new String[titles.length];
public void run(){
}
public String getAssignedDataPoint(int sensorIndex, int readingNumber){
String foundValue = "";
if(sensorIndex < titles.length){
if(sensorIndex == 0){
if(readingNumber < transmissionTemperatures.size()){
foundValue = transmissionTemperatures.get(readingNumber);
}
}else if(sensorIndex == 1){
if(readingNumber < engineTemperatures.size()){
foundValue = engineTemperatures.get(readingNumber);
}
}else if(sensorIndex == 2){
if(readingNumber <ambientTemperatures.size()){
foundValue = ambientTemperatures.get(readingNumber);
}
}else if(sensorIndex == 3){
if(readingNumber <auxiliaryTemperatures.size()){
foundValue = auxiliaryTemperatures.get(readingNumber);
}
}else if(sensorIndex == 4){
if(readingNumber <engineRPMs.size()){
foundValue = engineRPMs.get(readingNumber);
}
}else if(sensorIndex == 5){
if(readingNumber <cVTDrivenRPMs.size()){
foundValue = cVTDrivenRPMs.get(readingNumber);
}
}else if(sensorIndex == 6){
if(readingNumber <gPSLatitudes.size()){
foundValue = gPSLatitudes.get(readingNumber);
}
}else if(sensorIndex == 7){
if(readingNumber <gPSLongitudes.size()){
foundValue = gPSLongitudes.get(readingNumber);
}
}else if(sensorIndex == 8){
if(readingNumber <gPSAltitudes.size()){
foundValue = gPSAltitudes.get(readingNumber);
}
}else if(sensorIndex == 8){
if(readingNumber <gPSFixes.size()){
foundValue = gPSFixes.get(readingNumber);
}
}else if(sensorIndex == 10){
if(readingNumber <fuelLevels.size()){
foundValue = fuelLevels.get(readingNumber);
}
}else if(sensorIndex == 11){
if(readingNumber <throttlePositions.size()){
foundValue = throttlePositions.get(readingNumber);
}
}else if(sensorIndex == 12){
if(readingNumber <pointCounts.size()){
foundValue = pointCounts.get(readingNumber);
}
}else if(sensorIndex == 13){
if(readingNumber <auxiliarySensor1Readings.size()){
foundValue = auxiliarySensor1Readings.get(readingNumber);
}
}else if(sensorIndex == 14){
if(readingNumber <auxiliarySensor2Readings.size()){
foundValue = auxiliarySensor2Readings.get(readingNumber);
}
}else if(sensorIndex == 15){
if(readingNumber <auxiliarySensor3Readings.size()){
foundValue = auxiliarySensor3Readings.get(readingNumber);
}
}
}
if(foundValue.equals("")){
foundValue = "0";
System.out.println("HULLO? No sensor at requested index");
System.out.print(" (Index: " + sensorIndex + "readingNumber: " + readingNumber +")");
System.out.println(readingNumber);
}
return foundValue;
}
public int countAvailableSensors(String stringIn){
String[] bitsOfData = stringIn.split(",");
System.out.print("The bits of data: ");
System.out.println(bitsOfData);
System.out.print("There are "+bitsOfData.length+" sensors.");
return bitsOfData.length;
}
public void interpret(String stringIn){
//take last data point from SerialReader
// System.out.println("Parser Called");
//split at commas
String[] bitsOfData = stringIn.split(",");
//Check that we have a full string
if(stringIn.indexOf("<") != -1 && stringIn.indexOf(">") != -1){
//go through token by token
for(String token : bitsOfData){
//System.out.println(token);
if(token.indexOf("TMP") != -1){//We have found a temperature reading
//Split at :
String[] tokenSplit = token.split(":");
//Find title (T1, T2 etc)
//Add to appropriate list of sensorReadings
if(tokenSplit[0].indexOf("1")!=-1){
//We have transmission temperatures
transmissionTemperatures.add(tokenSplit[1]);
lastNumericalReadings[0] = tokenSplit[1];
}else if(tokenSplit[0].indexOf("2")!=-1){
//we have engine temperature
engineTemperatures.add(tokenSplit[1]);
lastNumericalReadings[1]= tokenSplit[1];
}else if(tokenSplit[0].indexOf("3")!=-1){
//we have ambient temperature
ambientTemperatures.add(tokenSplit[1]);
lastNumericalReadings[2]= tokenSplit[1];
}else if(tokenSplit[0].indexOf("4")!=-1){
//we have aux temperature
auxiliaryTemperatures.add(tokenSplit[1]);
lastNumericalReadings[3]= tokenSplit[1];
}
}else if(token.indexOf("RPM1") != -1){//We have found engine RPM reading
String[] tokenSplit = token.split(":");
engineRPMs.add(tokenSplit[1]);
lastNumericalReadings[4]= tokenSplit[1];
}else if(token.indexOf("RPM2")!=-1){//We have found CVT Driven RPM
String[] tokenSplit = token.split(":");
lastNumericalReadings[5]= tokenSplit[1];
cVTDrivenRPMs.add(tokenSplit[1]);
}else if(token.indexOf("GLON") != -1){//We have found GPS Latitude
String[] tokenSplit = token.split(":");
gPSLatitudes.add(tokenSplit[1]);
lastNumericalReadings[6]= tokenSplit[1];
}else if(token.indexOf("GLAT") != -1){//We have found GPS Longitude
String[] tokenSplit = token.split(":");
gPSLongitudes.add(tokenSplit[1]);
lastNumericalReadings[7]= tokenSplit[1];
}else if(token.indexOf("GALT") != -1){//We have found GPS Altitude
String[] tokenSplit = token.split(":");
gPSAltitudes.add(tokenSplit[1]);
lastNumericalReadings[8]= tokenSplit[1];
}else if(token.indexOf("GFIX") != -1){//We have found GPS Fix
String[] tokenSplit = token.split(":");
gPSFixes.add(tokenSplit[1]);
lastNumericalReadings[9]= tokenSplit[1];
}else if(token.indexOf("FUL1") != -1){//We have found fuel level
String[] tokenSplit = token.split(":");
fuelLevels.add(tokenSplit[1]);
lastNumericalReadings[10]= tokenSplit[1];
}else if(token.indexOf("TPS1") != -1){//We have found throttle position
String[] tokenSplit = token.split(":");
throttlePositions.add(tokenSplit[1]);
lastNumericalReadings[11]= tokenSplit[1];
}else if(token.indexOf("PNT1")!= -1){//We have found point count
String[] tokenSplit = token.split(":");
pointCounts.add(tokenSplit[1]);
lastNumericalReadings[12]= tokenSplit[1];
}else if(token.indexOf("AUX1")!= -1){//We have found Auxilary Sensor 1
String[] tokenSplit = token.split(":");
auxiliarySensor1Readings.add(tokenSplit[1]);
lastNumericalReadings[13]= tokenSplit[1];
}else if(token.indexOf("AUX2")!= -1){//We have found Auxilary Sensor 2
String[] tokenSplit = token.split(":");
auxiliarySensor2Readings.add(tokenSplit[1]);
lastNumericalReadings[14]= tokenSplit[1];
}else if(token.indexOf("AUX3")!= -1){//We have found Auxilary Sensor 3
String[] tokenSplit = token.split(":");
auxiliarySensor3Readings.add(tokenSplit[1]);
lastNumericalReadings[15]= tokenSplit[1];
}
}
setWriteToIndex(getWriteToIndex() + 1);
//if this is the first time through, say we're now ready for output and reset WriteToIndex
if(readyToOutput == false){
readyToOutput = true;
setWriteToIndex(0);
// for(String reading:lastNumericalReadings){
//
// }
}
System.out.println("Here's the last numerical readings: ");
System.out.println(Arrays.deepToString(lastNumericalReadings));
}else{
System.out.println("We didn't get a full string");
}
}
public static String[] getLastNumericalReadings(){
return lastNumericalReadings;
}
public int getWriteToIndex() {
return writeToIndex;
}
public void setWriteToIndex(int writeToIndex) {
this.writeToIndex = writeToIndex;
}
}
导入文件中的一行如下所示。不幸的是,它们看起来像HTML标签,因此发布整个文件是有问题的。但是典型的导入文件只是一堆类似于此的行,所以如果你冒险进行测试,只需将其粘贴到.txt一百万次。
<TMP1:142,TMP2:144,TMP3:138,RPM1:3708,RPM2:1280,GLAT:4042.6142,GLON:07400.4168,GALT:545.4,GFIX:0,FUL1:110.00,TPS1:210,TPS1:336,PNT1:0,>,
答案 0 :(得分:0)
看太多代码看看你在做什么。当你提出问题时,你应该发布一个简单的代码来证明这个问题。有关详细信息,请参阅SSCCE。
如何将水平滚动窗格中组件的垂直尺寸限制为滚动窗格的垂直尺寸?
您添加到滚动窗格的面板需要实现Scrollable
界面。特别是,您需要使用getScrollableTracksViewportHeight()
方法返回true
。
为了节省您自己实现整个界面,您可能需要查看Scrollable Panel。此类为您实现这些方法,您只需在类上设置属性即可获得所需的结果。听起来像你需要使用FIT
属性作为可滚动高度。